SELECT id, numbering, is_deleted, process_progress, create_time, create_user, engineering_name, construction, write_time, operator, fill_content, unit_opinions, approval_time, approver, submission_status, approval_status, supervision_agency, unit FROM ( SELECT f.* FROM ep_supervision_file f LEFT JOIN ep_process_auth_config c ON c.data_id = f.id AND c.module = 'supervision_file' WHERE ( f.create_user = 'xphd' -- 条件1 OR c.next_approver LIKE '%xphd%' -- 条件2 OR FIND_IN_SET('xphd', c.approvers) -- 条件3 OR ( (f.submission_status <> 'draft' AND f.submission_status <> 0) -- 提交状态不为 'draft' 或 0 AND f.unit LIKE '%d1735040387385%' -- 只有在提交状态满足条件时才考虑 unit LIKE ) ) ORDER BY f.create_time DESC -- 按创建时间倒序 ) AS ep_supervision_file WHERE is_deleted = 0 -- 排除已删除的数据 ORDER BY create_time DESC LIMIT 10; 这里 unit like 没生效怎么回事
时间: 2025-06-13 21:19:11 浏览: 16
<think>嗯,用户的问题是关于他们写的SQL查询中,`unit LIKE '%d1735040387385%'`这个条件没有生效。我需要仔细分析他们的查询语句,找出可能的原因。
首先,看一下整个SQL的结构。用户在主查询里嵌套了一个子查询,子查询中使用了多个条件,包括`f.create_user = 'xphd'`、`c.next_approver LIKE '%xphd%'`、`FIND_IN_SET('xphd', c.approvers)`,以及一个复杂的条件,当提交状态不是'draft'或0时,加上`unit LIKE`的条件。最后在外部查询中过滤了`is_deleted = 0`,并按时间排序取前10条。
可能的第一个问题是逻辑运算符的优先级。子查询的WHERE条件中,四个条件用OR连接,而最后一个条件是一个复合条件,里面用了AND。用户是否正确地使用了括号?即最后一个条件是否被正确包裹,确保AND的优先级高于OR?例如,正确的写法应该是`(条件1 OR 条件2 OR 条件3 OR (条件A AND 条件B))`。如果括号没有正确闭合,可能导致逻辑判断错误,使得`unit LIKE`的条件没有被正确应用。
接下来,检查字段的来源。`unit`字段是来自`ep_supervision_file`表吗?子查询中的主表是`f`,即`ep_supervision_file`表,而`unit`在外部查询中被选择,所以应该是存在的。不过,用户可能在子查询中是否有正确的别名引用?比如,`f.unit`是否正确?
第三个可能性是提交状态的条件。只有当`submission_status`不为'draft'或0时,才会检查`unit LIKE`。这里可能存在两个问题:首先,`submission_status`的值是否真的是字符串类型?如果该字段是数字类型,那么比较`submission_status <> 0`是正确的,但比较`<> 'draft'`可能不会生效,因为数字和字符串比较可能导致类型转换问题。例如,如果`submission_status`存储的是数字,那么`'draft'`会被转换为0,导致条件判断不正确。此时,当`submission_status`为0时,可能不会被正确排除。
第四个可能,`unit LIKE`的模式是否正确。用户使用的是`%d1735040387385%`,是否确实存在包含该字符串的记录?可能数据中没有匹配项,或者字符串的大小写不一致,而数据库的校对规则是否区分大小写?比如,如果数据库是大小写敏感的,而实际数据中的unit是大写的,那么可能无法匹配。
另外,检查子查询中的条件是否被正确应用。例如,是否在子查询中已经过滤掉了某些行,导致外部查询中的`unit LIKE`没有被触发?不过,用户的外部查询只是过滤了`is_deleted = 0`,而子查询已经包含了所有条件,所以可能问题出在子查询的条件逻辑上。
还有一个可能性是,当使用OR连接多个条件时,只要其中一个条件满足,该行就会被选中。例如,如果其他条件(如create_user = 'xphd')有很多符合条件的记录,那么即使unit LIKE没有匹配,这些记录也会被包括进来,导致用户误以为unit的条件没生效。这时候需要确认用户是否在测试时使用了确保`unit LIKE`应该被满足的数据,而其他条件可能覆盖了结果集。
总结可能的原因:
1. 条件逻辑中的括号使用错误,导致`unit LIKE`的条件没有被正确组合。
2. `submission_status`的类型问题,导致比较运算符未能正确过滤。
3. `unit`字段的实际数据与LIKE模式不匹配。
4. 其他OR条件的结果覆盖了预期的数据,导致unit条件看似未生效。
5. 字段来源或别名错误,如未正确引用`f.unit`。
需要进一步验证这些可能性。例如,检查子查询中的WHERE条件是否用括号正确包裹最后一个AND条件;检查`submission_status`的数据类型和实际值;测试单独使用`unit LIKE`条件是否能返回结果;以及确认数据中是否存在符合条件的情况。</think>针对SQL中`unit LIKE`未生效的问题,以下是逐步排查和解决方案:
---
### **一、优先检查条件逻辑括号**
**问题现象**:
```sql
WHERE
(f.create_user = 'xphd' -- 条件1
OR c.next_approver LIKE '%xphd%' -- 条件2
OR FIND_IN_SET('xphd', c.approvers) -- 条件3
OR ( -- ❌ 此处缺少一个左括号包裹整个复合条件
(f.submission_status <> 'draft' AND f.submission_status <> 0)
AND f.unit LIKE '%d1735040387385%'
))
```
**分析**:
原条件逻辑中,`OR`后的复合条件缺少左括号,导致逻辑优先级错误。正确写法应确保`AND`的优先级高于`OR`。
**修正方案**:
```sql
WHERE
(
f.create_user = 'xphd' -- 条件1
OR c.next_approver LIKE '%xphd%' -- 条件2
OR FIND_IN_SET('xphd', c.approvers) -- 条件3
OR ( -- ✅ 明确包裹复合条件
(f.submission_status <> 'draft' AND f.submission_status <> 0)
AND f.unit LIKE '%d1735040387385%'
)
)
```
---
### **二、验证字段类型与数据匹配**
**问题现象**:
`submission_status`字段可能是数字类型,但代码中与字符串`'draft'`比较。
**分析**:
如果`submission_status`为数字类型(如0表示草稿,1表示已提交),则`f.submission_status <> 'draft'`会隐式转换为数字0,导致逻辑错误。
**修正方案**:
```sql
-- 假设 submission_status 的数字含义:
-- 0=草稿, 1=已提交
(f.submission_status <> 0) -- 直接比较数字
AND f.unit LIKE '%d1735040387385%'
```
---
### **三、单独测试`unit LIKE`条件**
**排查步骤**:
1. **单独执行子查询**:
```sql
SELECT * FROM ep_supervision_file
WHERE unit LIKE '%d1735040387385%'
```
验证是否能返回预期结果,确认数据是否存在。
2. **检查大小写敏感性**:
如果数据库校对规则区分大小写(如`utf8_bin`),需确保`unit`字段的值与模式`%d1735040387385%`完全匹配大小写。
---
### **四、其他条件覆盖问题**
**问题现象**:
若前三个条件(`create_user`, `next_approver`, `approvers`)已匹配大量数据,即使`unit LIKE`未生效,结果集中也可能包含其他条件的记录。
**验证方法**:
在查询中**临时注释其他条件**,强制仅依赖`unit LIKE`条件,观察是否能返回预期结果。
---
### **五、完整修正后的SQL示例**
```sql
SELECT
id, numbering, is_deleted, process_progress, create_time, create_user,
engineering_name, construction, write_time, operator, fill_content,
unit_opinions, approval_time, approver, submission_status, approval_status,
supervision_agency, unit
FROM
(
SELECT
f.*
FROM
ep_supervision_file f
LEFT JOIN ep_process_auth_config c ON c.data_id = f.id
AND c.module = 'supervision_file'
WHERE
(
f.create_user = 'xphd'
OR c.next_approver LIKE '%xphd%'
OR FIND_IN_SET('xphd', c.approvers)
OR ( -- ✅ 正确包裹复合条件
(f.submission_status <> 'draft' AND f.submission_status <> 0)
AND f.unit LIKE '%d1735040387385%'
)
)
ORDER BY
f.create_time DESC
) AS ep_supervision_file
WHERE
is_deleted = 0
ORDER BY
create_time DESC
LIMIT 10;
```
---
### **总结**
1. **括号逻辑错误**是主要原因,需确保复合条件被正确包裹。
2. 检查字段类型与比较值的兼容性。
3. 单独验证`unit LIKE`条件是否独立有效。
4. 确保其他条件未覆盖预期结果。
阅读全文
相关推荐

















