已知VALUE列指定取值,MySQL如何查询匹配的相同ID行
问题整理
本人是一名编程初学者,近期遇到了一个数据库查询相关的编程难题:
当前所用数据表的示例记录如下:
| ID | VALUE |
|---|---|
| 1 | 5 |
| 1 | 4 |
| 2 | 3 |
| 2 | 4 |
| 3 | 3 |
| 3 | 5 |
需要检索出同一ID下同时存在VALUE值为3、4的匹配记录,最终期望得到的结果为ID为2的记录,求对应的MySQL查询语句。
解决方案
该需求属于分组下多值同时匹配场景,三种常用实现写法:
- 写法1:
GROUP BY + HAVING(易理解,适合小数据量)
SELECT ID FROM `替换为实际表名` WHERE VALUE IN (3, 4) GROUP BY ID HAVING COUNT(DISTINCT VALUE) = 2;
逻辑说明:先过滤出VALUE为3或4的行,按ID分组后统计每个ID下不重复的VALUE数量,等于2即同时包含3、4,加DISTINCT可避免重复VALUE干扰计数。
- 写法2:自连接(性能优,适合大数据量)
SELECT DISTINCT ID FROM `替换为实际表名` t1 INNER JOIN `替换为实际表名` t2 ON t1.ID = t2.ID AND t1.VALUE = 3 AND t2.VALUE = 4;
逻辑说明:表自身关联,强制同一ID下同时存在VALUE=3和VALUE=4的行,DISTINCT去重返回结果。
- 写法3:
EXISTS子查询(扩展性强,可快速叠加多VALUE条件)
SELECT DISTINCT ID FROM `替换为实际表名` t1 WHERE VALUE = 3 AND EXISTS ( SELECT 1 FROM `替换为实际表名` t2 WHERE t2.ID = t1.ID AND t2.VALUE = 4 );
逻辑说明:先匹配所有VALUE=3的行,再校验对应ID是否存在VALUE=4的记录,后续如果要加VALUE=5之类的条件,直接叠加AND EXISTS即可。
注意:所有写法中的
替换为实际表名需要换成你自己业务里的表名称。
内容的提问来源于stack exchange,提问作者maniek
相关产品推荐
相关产品推荐

