MySQL技术问询:如何在WHERE子句中使用SELECT查询结果筛选记录?
数据表结构与数据
| id | date | prev | cam |
|---|---|---|---|
| 1 | 2024-07-06 | 98955 | 41 |
| 2 | 2024-07-05 | 98955 | 31 |
| 3 | 2024-07-05 | 98000 | 41 |
| 4 | 2024-07-06 | 100955 | 41 |
需求说明
筛选出date='2024-07-06'的记录,要求该记录的prev值在date='2024-07-05'的记录中存在不同的cam值,预期结果仅为id=1的记录。
正确查询方法
方法1:JOIN关联查询
SELECT t1.* FROM maincourante t1 JOIN maincourante t2 ON t1.prev = t2.prev AND t2.date = '2024-07-05' WHERE t1.date = '2024-07-06' AND t1.cam != t2.cam;
逻辑:将目标日期(07-06)的记录与前一天(07-05)同prev的记录关联,直接筛选出两者cam值不同的记录。
方法2:EXISTS子查询
SELECT * FROM maincourante t1 WHERE t1.date = '2024-07-06' AND EXISTS ( SELECT 1 FROM maincourante t2 WHERE t2.prev = t1.prev AND t2.date = '2024-07-05' AND t2.cam != t1.cam );
逻辑:对07-06的每条记录,检查是否存在同prev、07-05且cam值不同的记录,存在则保留当前记录。
原查询问题说明
原查询存在字段名错误(如camera应为cam,mc_data/data应为date),且子查询若返回多行会触发报错,逻辑不够严谨,上述两种方法可避免这些问题并准确得到预期结果。
内容的提问来源于stack exchange,提问作者DellaeMme
相关产品推荐
相关产品推荐

