You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

逻辑解释

  1. LEFT JOIN + ON条件:把r.user = 1放在JOIN的ON条件里,而不是WHERE里,这很关键!这样左表的所有记录都会被保留下来,右表只会匹配用户1的关联行,其他用户的右表记录会被直接排除在关联结果之外,不会干扰后续筛选。
  2. WHERE筛选:
    • r.left_id IS NULL:代表左表这条记录在右表里没有任何用户1的关联(甚至没有其他用户的,因为其他用户的记录根本没被关联进来),也就是完全未被右表关联的左表记录。
    • r.status = 0:代表左表这条记录存在用户1的关联,且状态为0,符合你的要求。

预期结果

执行上面的SQL后,你会得到如下结果集:

left_idtitleright_status
1Title 10
3Title 30
4Title 4NULL
5Title 5NULL

完全符合你要的需求:排除了ID=2的记录(因为用户1关联它的status是1,不满足条件),剩下的都是符合要求的。

内容的提问来源于stack exchange,提问作者Cracs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:02:40