如果id在另一个表中不匹配,则返回null

t5zmwmid  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(347)

我有三张table需要放在一起。
1- payments 表格:

id
member_id
year_id
notes
paid
paid_at
created_at
updated_at

2- yearly_fees 表格:

id
year
amount
created_at
updated_at

3- members 表格:

id
first_name
last_name

我想做的是显示一个名单的所有成员谁支付和没有支付在x年。
预期示例输出:

id  first_name  father_name     notes       paid    year    amount
1   test name   test last_name  test note   1       2018    3000
2   test name   test last_name  test note   NULL    NULL    NULL
3   test name   test last_name  test note   1       2018    3000
4   test name   test last_name  NULL        NULL    NULL    NULL
5   test name   test last_name  NULL        NULL    NULL    NULL

这是我写的问题:

SELECT `members`.`id`, `members`.`first_name`, `members`.`last_name`, 
`payments`.`notes`, `payments`.`paid`, `yearly_fees`.`year`, 
`yearly_fees`.`amount` FROM `members` 
LEFT JOIN payments ON payments.member_id = members.id 
LEFT JOIN yearly_fees ON yearly_fees.id = payments.year_id
WHERE payments.year_id = 4

结果:

id  first_name  father_name     notes       paid    year    amount
1   test name   test last_name  test note   1       2018    3000
2   test name   test last_name  test note   1       2018    3000
3   test name   test last_name  test note   1       2018    3000

这个 WHERE 语句只输出与 payments 表,但我希望它也输出每个成员,即使其余的行结果为null。如果我移除 WHERE 声明,它的工作方式正是我想要的,但它得到了我所有的年,而不是我特别想要的。
这是一个示例输出:

id  first_name  father_name     notes       paid    year    amount
1   test name   test last_name  test note   1       2016    3000
2   test name   test last_name  test note   1       2015    3000
3   test name   test last_name  test note   1       2018    3000
4   test name   test last_name  test note   1       2018    3000
5   test name   test last_name  test note   1       2018    3000
6   test name   test last_name  NULL        NULL    NULL    NULL
7   test name   test last_name  NULL        NULL    NULL    NULL

提前为英语不好道歉。

b4lqfgs4

b4lqfgs41#

你需要把条件转移到 ON 条款:

SELECT `m`.`id`, `m`.`first_name`, `m`.`last_name`, 
       `p`.`notes`, `p`.`paid`, `yf`.`year`, `yf`.`amount`
FROM `members` m JOIN
     yearly_fees yf
     ON yf.year_id = 4 LEFT JOIN
     payments p
     ON p.member_id = m.id AND p.year_id = yf.id;

如果你觉得
JOIN yearly_fees 首先,因为比赛应该一直在那里。然后使用 LEFT JOIN 查看中是否有匹配的行 payments .

相关问题