MySQL查询where中包含多个in条件问题

示例:

select * from x_table where a in (1,2,3) and b in (4,8)

上面这种查询方法,如果可以通过a和b唯一确定一条数据,但a和b列可以有相同值时,会造成查询数据不准确。

验证:

假设有以下数据(手机号为假数据),现在要查询stu_phone和recruit_source_id字段值分别为18700009999和3,以及18099990000和2的两条数据,可能会查询出多余的数据

查询语句和结果如下图:

由于两个in条件中的值会形成笛卡尔积,产生了我们并不需要的条件组合。

解决:

MySQL 中,子查询的优化和多条件匹配是常见的查询需求。当需要满足多个条件时,可以通过合理使用 `WHERE` 子句、`JOIN` 操作以及索引优化来提升查询性能。 ### 多条件匹配的子查询 在涉及多个条件的子查询中,可以将多个筛选条件组合起来,以确保子查询返回符合预期的结果集。例如,若要查询某个表中满足多个条件的数据,并将其作为外层查询的输入,可以采用如下结构: ```sql SELECT * FROM s1 WHERE key1 = ( SELECT common_field FROM s2 WHERE key3 = 'a' AND other_condition > 10 LIMIT 1 ); ``` 在这个例子中,内层子查询不仅检查 `key3 = 'a'`,还要求 `other_condition > 10`,从而进一步缩小结果范围[^1]。外层查询则基于这个结果进行过滤。 ### 子查询优化策略 为了提高包含多个条件的子查询的执行效率,可以采取以下几种优化措施: - **使用 `EXISTS` 替代 `IN`**:当子查询返回大量数据时,`EXISTS` 的性能通常优于 `IN`,因为一旦找到匹配项即可停止搜索。 ```sql SELECT * FROM s1 WHERE EXISTS ( SELECT 1 FROM s2 WHERE s2.common_field = s1.key1 AND s2.key3 = 'a' AND s2.other_condition > 10 ); ``` - **避免不必要的 `LIMIT` 和子查询嵌套**:如果子查询可能返回多个结果,但业务逻辑上只需要一个值,则应使用 `LIMIT 1` 明确限制结果数量[^1]。 - **使用连接(JOIN)代替子查询**:某些情况下,将子查询转换为 `JOIN` 操作能显著提升性能,尤其是当两个表都具有合适的索引时。 ```sql SELECT s1.* FROM s1 INNER JOIN s2 ON s1.key1 = s2.common_field WHERE s2.key3 = 'a' AND s2.other_condition > 10; ``` - **建立合适的索引**:对频繁出现在 `WHERE` 和 `JOIN` 条件中的列建立复合索引,可以大幅提升查询速度。 ### 示例:模糊匹配与多条件结合 若需在子查询中结合模糊匹配与多个精确条件,可参考如下写法: ```sql SELECT * FROM human_base_info WHERE id_card IN ( SELECT id_card FROM human_active_record WHERE feature LIKE '%淡黄色的长裙%蓬松的头发%' AND status = 'active' AND create_time > '2024-01-01' ); ``` 此查询通过 `LIKE` 实现模糊匹配,同时结合了 `status` 和 `create_time` 等精确条件,确保子查询结果更加精准[^3]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值