SQL LEFT JOIN查询问题:筛选左表特定数据并获取右表status字段
解决左表未关联或特定右表条件的JOIN查询问题
看起来你需要筛选左表的记录,要么是完全没被右表关联的,要么是被用户ID=1的右表记录关联且状态为0的,同时还要带上右表的status字段对吧?我来帮你搞定这个查询。
首先先明确两张表的结构和数据(我把SQL关键字用反引号括起来避免语法错误):
表结构与测试数据
左表 left
CREATE TABLE `left` ( ID INT PRIMARY KEY, title VARCHAR(50) ); INSERT INTO `left` VALUES (1, 'Title 1'), (2, 'Title 2'), (3, 'Title 3'), (4, 'Title 4'), (5, 'Title 5');
右表 right
CREATE TABLE `right` ( ID INT PRIMARY KEY, status INT, user INT, left_id INT ); INSERT INTO `right` VALUES (1, 0, 1, 1), (2, 0, 50, 1), (3, 1, 1, 2), (4, 0, 50, 2), (5, 0, 1, 3), (6, 1, 50, 3);
解决方案SQL
这里核心是用LEFT JOIN结合精准的关联条件和过滤条件,确保左表所有符合要求的记录都被保留:
SELECT l.ID AS left_id, l.title, r.status AS right_status FROM `left` l LEFT JOIN `right` r ON l.ID = r.left_id AND r.user = 1 -- 只关联用户ID为1的右表记录 WHERE r.left_id IS NULL -- 左表未被右表任何记录关联 OR r.status = 0; -- 或者关联到的用户1的记录状态为0
逻辑解释
- LEFT JOIN + ON条件:把
r.user = 1放在JOIN的ON条件里,而不是WHERE里,这很关键!这样左表的所有记录都会被保留下来,右表只会匹配用户1的关联行,其他用户的右表记录会被直接排除在关联结果之外,不会干扰后续筛选。 - WHERE筛选:
r.left_id IS NULL:代表左表这条记录在右表里没有任何用户1的关联(甚至没有其他用户的,因为其他用户的记录根本没被关联进来),也就是完全未被右表关联的左表记录。r.status = 0:代表左表这条记录存在用户1的关联,且状态为0,符合你的要求。
预期结果
执行上面的SQL后,你会得到如下结果集:
| left_id | title | right_status |
|---|---|---|
| 1 | Title 1 | 0 |
| 3 | Title 3 | 0 |
| 4 | Title 4 | NULL |
| 5 | Title 5 | NULL |
完全符合你要的需求:排除了ID=2的记录(因为用户1关联它的status是1,不满足条件),剩下的都是符合要求的。
内容的提问来源于stack exchange,提问作者Cracs
相关产品推荐
相关产品推荐

