MySQL三表联合查询需求:按指定条件返回目标结果集
MySQL 查询需求与实现方案
现有数据表
表A(Table A)
| id | name | number | category |
|---|---|---|---|
| 1 | 苹果 | 5 | F |
| 2 | 橙子 | 1 | F |
| 3 | 球 | 2 | X |
| 4 | 香蕉 | 10 | F |
表B(Table B)
| id | name | number | confirm |
|---|---|---|---|
| 1 | 苹果 | 5 | yes |
| 1 | 苹果 | 1 | no |
| 4 | 香蕉 | 2 | yes |
| 4 | 香蕉 | 1 | yes |
表C(Table C)
| id | name | number | confirm |
|---|---|---|---|
| 2 | 橙子 | 2 | yes |
| 4 | 香蕉 | 2 | no |
查询要求
- 仅返回表A中
category = 'F'的记录的id、name、number字段,其他记录不返回 - 表B中仅统计
confirm = 'yes'的number求和值,无符合条件记录则返回0 - 表C中仅统计
confirm = 'yes'的number求和值,无符合条件记录则返回0
期望结果
| id | name | A | B | C |
|---|---|---|---|---|
| 1 | 苹果 | 5 | 5 | 0 |
| 2 | 橙子 | 1 | 0 | 2 |
| 4 | 香蕉 | 10 | 3 | 0 |
实现SQL语句
SELECT a.id, a.name, a.number AS A, IFNULL(b.sum_b, 0) AS B, IFNULL(c.sum_c, 0) AS C FROM TableA a LEFT JOIN ( SELECT id, SUM(CASE WHEN confirm = 'yes' THEN number ELSE 0 END) AS sum_b FROM TableB GROUP BY id ) b ON a.id = b.id LEFT JOIN ( SELECT id, SUM(CASE WHEN confirm = 'yes' THEN number ELSE 0 END) AS sum_c FROM TableC GROUP BY id ) c ON a.id = c.id WHERE a.category = 'F' ORDER BY a.id;
思路说明
- 先对表B、表C按
id分组,用CASE语句筛选出confirm='yes'的记录并求和,不符合条件的记为0 - 通过左连接将表A与两个分组后的统计结果关联,保证表A中符合
category='F'的所有记录都能被保留 - 用
IFNULL处理左连接后可能出现的空值,将其替换为0,确保结果统一为数值格式 - 最后通过
WHERE子句过滤出表A中category='F'的记录,并按id排序
内容的提问来源于stack exchange,提问作者S R R
相关产品推荐
相关产品推荐

