使用IN语句实现多表查询并返回全部结果的技术需求
用IN语句实现查询并返回全部项目内容
嘿,我来帮你搞定这个需求!先理清楚你的表关联逻辑:
projects表的id对应stages表的pr_id,用来关联项目和它的阶段stages表的t_id对应stad_ids表的id,关联阶段的标准分类
你的需求是用IN语句做查询,同时不管查询匹配结果如何都要返回全部内容——我猜你是想保留所有项目的记录,哪怕某个项目没有符合筛选条件的阶段,也不能把项目本身过滤掉对吧?下面给你具体的方案:
先回顾下你的表结构和数据
把你的表数据整理成SQL代码块,方便对照:
projects表
id | title 28 | pr28 31 | pr31 65 | pr65 74 | pr74
stages表
pr_id | id | t_id| title | comments 28 | 65 | 1 | st1 | bla 28 | 86 | 3 | st3 | blaaaa 31 | 132 | 1 | st1 | blabla 65 | 189 | 1 | st1 | bli 65 | 190 | 2 | st2 | blibli 65 | 224 | 3 | st3 | bliblib 74 | 319 | 3 | st3 | blibli 74 | 333 | 5 | st5 | blibli
stad_ids表
id | title 1 | st1 2 | st2 3 | st3 4 | st4 5 | st5
具体的SQL查询语句
这里分两种常见场景给你写:
场景1:筛选特定标准阶段(用IN指定t_id),同时保留所有项目
比如你想只看属于st1和st3(对应t_id=1和3)的阶段,但所有项目都要显示,哪怕某个项目没有这两个阶段:
SELECT p.id AS project_id, p.title AS project_title, s.id AS stage_id, s.title AS stage_title, s.comments, si.title AS standard_stage_title FROM projects p LEFT JOIN stages s ON p.id = s.pr_id AND s.t_id IN (1, 3) -- 用IN筛选你要的标准阶段ID LEFT JOIN stad_ids si ON s.t_id = si.id ORDER BY p.id, s.t_id;
这个语句里,IN放在LEFT JOIN的连接条件里,这样不会过滤掉没有匹配阶段的项目,只会把符合条件的阶段关联进来,不符合的阶段就不会显示,项目本身始终保留。
场景2:筛选阶段标题在指定列表,同时保留所有项目
如果你是想根据阶段标题筛选,比如只看st1、st3的阶段,同时保留所有项目:
SELECT p.id AS project_id, p.title AS project_title, s.id AS stage_id, s.title AS stage_title, s.comments, si.title AS standard_stage_title FROM projects p LEFT JOIN stages s ON p.id = s.pr_id LEFT JOIN stad_ids si ON s.t_id = si.id WHERE s.title IN ('st1', 'st3') OR s.title IS NULL -- 保留没有阶段的项目 ORDER BY p.id, s.t_id;
这里把IN放在WHERE里,同时加了OR s.title IS NULL,确保那些没有任何阶段的项目也能被返回(不过你的数据里每个项目都有阶段,这个逻辑是为了兼容更通用的情况)。
关键点说明
- 用
LEFT JOIN是核心,它能保证左边的projects表的所有记录都被返回,哪怕右边的stages没有匹配项 IN语句用来指定你的筛选范围,你可以根据实际需求替换里面的值,比如换成(2,5)或者('st2','st5')- 如果你的“返回全部内容”是指要返回所有表的所有记录(不管关联关系),那可以用交叉连接,但这通常不是实际业务需要的,所以上面的左连接方案更贴合你的需求
内容的提问来源于stack exchange,提问作者jbr
相关产品推荐
相关产品推荐

