MySQL如何查询同时满足同列多匹配条件的对应rack_id值
MySQL行式存储多属性匹配查询方案
现有一张存储动态数据的MySQL行式存储表,表结构包含3个字段:id(主键)、rack_id(机架ID)、data(动态属性值),示例数据如下:
| id | rack_id | data |
|---|---|---|
| 1 | 101 | Red |
| 2 | 101 | 14CM |
| 3 | 101 | Open |
| 4 | 102 | Green |
| 5 | 102 | 14CM |
| 6 | 102 | Open |
| 7 | 103 | Red |
| 8 | 103 | 20CM |
| 9 | 103 | Open |
| 10 | 104 | Red |
| 11 | 104 | 14CM |
| 12 | 104 | Close |
需求为查询同时满足data值为Red和14CM的所有rack_id,预期返回结果为101、104。
可用查询方案
方案1:分组聚合筛选(推荐)
该方案拓展性强,后续新增匹配条件只需修改两处参数即可,代码如下:
SELECT rack_id FROM 替换为你的实际表名 WHERE data IN ('Red', '14CM') GROUP BY rack_id HAVING COUNT(DISTINCT data) = 2;
逻辑说明:
- 先用WHERE过滤出所有data值属于目标匹配范围的记录,缩小计算范围
- 按rack_id分组后,判断每个分组内去重后的data数量刚好等于目标匹配条件的数量(此处为2),即可证明该rack_id同时包含所有目标属性
方案2:自连接查询
该方案适合匹配条件少的场景,代码如下:
SELECT DISTINCT t1.rack_id FROM 替换为你的实际表名 t1 INNER JOIN 替换为你的实际表名 t2 ON t1.rack_id = t2.rack_id WHERE t1.data = 'Red' AND t2.data = '14CM';
逻辑说明:
- 把表做自关联,关联条件为rack_id相同
- 两个关联表分别匹配不同的目标data值,能关联上的rack_id即为同时满足两个条件的目标值,加DISTINCT避免重复返回
内容的提问来源于stack exchange,提问作者jawad
相关产品推荐
相关产品推荐

