如何根据关联表条件查询符合要求的用户名(SQL)
问题解决:符合条件的用户查询
数据表结构
user表
| id | full_name | is_admin | is_active |
|---|---|---|---|
| 1 | Alan | 0 | 1 |
| 2 | Carl | 0 | 1 |
| 3 | Any | 0 | 1 |
| 4 | Jane | 0 | 1 |
| 5 | Marry | 0 | 1 |
| 6 | Pedri | 0 | 1 |
| 7 | admin | 1 | 1 |
| 8 | Mota | 0 | 0 |
approver表
(subordinate_id、leader_id和main_leader_id为关联user表id列的外键)
| id | subordinate_id | leader_id | main_leader_id | is_active |
|---|---|---|---|---|
| 1 | 1 | 2 | 3 | 0 |
| 2 | 4 | 5 | 6 | 1 |
| 3 | 1 | 2 | 4 | 0 |
查询需求
需获取满足以下条件的用户名:
- 非管理员(user表
is_admin=0)且状态活跃(user表is_active=1); - 若该用户在approver表的
subordinate_id列存在记录,仅保留approver表is_active=0的用户。
原查询问题
原查询语句:
SELECT full_name FROM user AS U LEFT JOIN approver AS A ON U.id = A.subordinate_id WHERE A.id is null AND U.is_admin = 0 AND U.is_active = 1
该语句仅筛选出未在approver表中存在记录的用户,漏掉了在approver表中有记录但is_active=0的用户(比如Alan)。
正确SQL查询
方式一:LEFT JOIN + 条件过滤
SELECT DISTINCT U.full_name FROM user AS U LEFT JOIN approver AS A ON U.id = A.subordinate_id WHERE U.is_admin = 0 AND U.is_active = 1 AND (A.id IS NULL OR A.is_active = 0)
- 用
LEFT JOIN保留所有符合用户基础条件的记录; - 通过
(A.id IS NULL OR A.is_active = 0)筛选:要么无审批记录,要么审批记录非活跃; DISTINCT去重,避免同一用户多条审批记录导致重复结果。
方式二:子查询筛选
SELECT full_name FROM user WHERE is_admin = 0 AND is_active = 1 AND ( id NOT IN (SELECT DISTINCT subordinate_id FROM approver) OR id IN (SELECT DISTINCT subordinate_id FROM approver WHERE is_active = 0) )
- 子查询分别获取所有有审批记录的用户,以及审批记录非活跃的用户;
- 条件逻辑:要么不在审批记录中,要么在审批记录且状态为0。
验证结果
执行上述查询后,得到预期结果:
Alan Carl Any Marry Pedri
内容的提问来源于stack exchange,提问作者Louis
相关产品推荐
相关产品推荐

