多条件SQL查询需求:关联3张表筛选指定用户与商品数据
解决方案
直接给出适配需求的SQL语句及关键调整说明:
SELECT t1.user_name AS 'User_Name', GROUP_CONCAT(t3.item_id ORDER BY t3.item_id ASC) AS 'Shipped' FROM table1 t1 LEFT JOIN table3 t3 ON t1.id = t3.user_id AND ( (t3.user_id != 17 AND t3.shipped = 1) OR (t3.user_id = 17 AND t3.stat = 0) ) GROUP BY t1.id, t1.user_name ORDER BY COUNT(t3.item_id) DESC;
核心调整点:
- 改用LEFT JOIN从table1发起关联:确保所有用户都被保留,无符合条件商品的用户会在
Shipped列返回NULL,满足无对应记录时返回NULL的需求。 - 将筛选条件嵌入JOIN子句:避免WHERE子句过滤掉无table3记录的用户,同时精准实现分场景筛选:
- user_id≠17时,仅关联
shipped=1的table3记录 - user_id=17时,仅关联
stat=0的table3记录
- user_id≠17时,仅关联
- 修正原SQL的错误:把
accounts改为table1,t1.username改为t1.user_name,移除未用到的table2关联以减少冗余
示例数据对应输出:
| User_Name | Shipped |
|---|---|
| User1 | 6,7,8,9 |
| User17 | NULL |
若只需显示有符合条件商品的用户,可在语句末尾添加HAVING Shipped IS NOT NULL。
内容的提问来源于stack exchange,提问作者master_of_nothing
相关产品推荐
相关产品推荐

