我有这样的声明:
SELECT personen.*, klassen.naam as klas FROM `personen`
JOIN `klassen` ON `klassen`.id = `personen`.Id
WHERE `rol` = "Docent" ORDER BY id
我知道它通常会通过检查外键klassen.naam
是否与Klassen的ID相同来将列personen
放入K_Id
:
在上表中,我有4个结果,这些是分配了K_Id
的所有人,但是还有2个人K_Id
null
:
我的问题是,当K_Id
为null
时,它根本不会返回任何内容,这是有道理的,我只是不知道如何修复它。
我的问题是:我如何编写语句,以便它仍然显示K_Id
值为null
的所有其他行?
答案 0 :(得分:1)
SELECT personen.*, klassen.naam as klas
FROM `personen`
JOIN `klassen`
ON `klassen`.id = `personen`.Id
WHERE `rol` = "Docent"
ORDER BY id
如果你想要来自人格表的所有数据你应该使用左连接,其中personen.id在klassen表中不存在它看起来像这样
SELECT personen.*, klassen.naam as klas
FROM `personen`
LEFT JOIN `klassen`
ON `klassen`.id = `personen`.Id
WHERE `rol` = "Docent"
ORDER BY id
答案 1 :(得分:0)
您可以使用left join
来实现此目的。假设rol
表中有personen
:
SELECT p.*, k.naam as klas
FROM `personen` p LEFT JOIN
`klassen` i
ON i.id = p.Id
WHERE p.`rol` = 'Docent'
ORDER BY p.id;
如果rol
位于klassen
表格中,那么:
SELECT p.*, k.naam as klas
FROM `personen` p LEFT JOIN
`klassen` i
ON i.id = p.Id AND i.`rol` = 'Docent'
ORDER BY p.id;
请注意,我还在查询中引入了表别名。这些使查询更容易编写和阅读。
此外,这将返回personen
表中的所有行(受where
约束),包括不匹配。如果您只是特别想要NULL值,那么您将使用:
SELECT p.*, k.naam as klas
FROM `personen` p JOIN
`klassen` i
ON i.id = p.Id or p.id is null
WHERE p.`rol` = 'Docent'
ORDER BY p.id;
我猜你真的想要left join
版本。