基于LEFT JOIN的MySQL多表查询:满足指定条件的Job数据需求
MySQL LEFT JOIN 分组查询解决方案
没问题,我来帮你搞定这个查询需求。先明确一下你的表结构和现有数据:
表结构与数据
job表
| id | name | status |
|---|---|---|
| 1 | test | active |
| 2 | check | active |
repair表
| repair_id | job_id | process | status |
|---|---|---|---|
| 1 | 1 | no | 2 |
| 2 | 1 | no | 1 |
| 3 | 1 | yes | 2 |
| 4 | 2 | no | 1 |
| 5 | 2 | no | 2 |
需求分析
你需要通过LEFT JOIN关联两张表,筛选出满足process != 'yes'且repair.status != 2的记录,再按job_id分组,最终得到仅包含job_id=2的结果。结合你的期望结果,核心逻辑是:找出存在至少一条符合条件的repair记录,且该job没有任何process='yes'的repair记录。
实现SQL
SELECT r.job_id, j.name, j.status FROM job j LEFT JOIN repair r ON j.id = r.job_id WHERE r.process != 'yes' AND r.status != 2 GROUP BY r.job_id, j.name, j.status HAVING COUNT(CASE WHEN r.process = 'yes' THEN 1 END) = 0;
结果验证
执行这条SQL后,会得到你期望的结果:
| job_id | name | status |
|---|---|---|
| 2 | check | active |
代码解释
- LEFT JOIN关联:通过
job.id = repair.job_id关联两张表,确保关联逻辑正确。 - WHERE筛选:先过滤出repair表中满足
process != 'yes'且status != 2的有效记录。 - GROUP BY分组:按
job_id和job表的name、status分组(MySQL要求分组后SELECT的列需为分组列或聚合列)。 - HAVING子句:通过聚合逻辑排除存在
process='yes'记录的job——job1因为有一条process='yes'的repair记录被排除,最终只保留符合要求的job2。
如果只是单纯筛选符合条件的记录并去重(不考虑该job是否有其他不符合的记录),可以用简化版:
SELECT DISTINCT r.job_id, j.name, j.status FROM job j LEFT JOIN repair r ON j.id = r.job_id WHERE r.process != 'yes' AND r.status != 2;
但这条SQL会返回job1和job2两条记录,不符合你的期望,所以还是第一条SQL更贴合需求。
内容的提问来源于stack exchange,提问作者Durai Raj
相关产品推荐
相关产品推荐

