join和null值未显示的行

时间:2014-11-30 13:31:45

标签: php mysql sql join

我有这样的声明:

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

http://i.imgur.com/TNlMBpd.png

在上表中,我有4个结果,这些是分配了K_Id的所有人,但是还有2个人K_Id null

http://i.imgur.com/3IPX92E.png

我的问题是,当K_Idnull时,它根本不会返回任何内容,这是有道理的,我只是不知道如何修复它。

我的问题是:我如何编写语句,以便它仍然显示K_Id值为null的所有其他行?

2 个答案:

答案 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版本。