mysql左连接不返回所有左表行

时间:2016-01-21 05:29:45

标签: php mysql

我有2张桌子

phonetype:
phonetypeID (PK)
phonetyepe

phone:
phoneID (PK)
peopleID (fK)
phonetypeID (fK)
areacode
number`

对于特定的peopleID,我想返回所有的phonetypes,如果peopleID有数字diplay它,如果不是空的。类似的东西:

phonetype    phonetypeID    areacode    number
company      1              111         11111
fax          2
home         3              222         222222
mobile       4

这是我准备好的声明:

$stmt = $conn->prepare("SELECT *
FROM phonetype
LEFT JOIN phone
ON phonetype.phonetypeID=phone.phonetypeID
where phone.peopleID = ?; 
");
if ( !$stmt ) {die(printf("Error: %s.\n", mysqli_stmt_error($stmt) ) );}
else if ( !$stmt->bind_param('i', $peopleID) ) {die(printf("Error: %s.\n", mysqli_stmt_error($stmt) ) );}

但这样我只有

phonetype    phonetypeID    areacode    number
company      1              111         11111
home         3              222         222222

我做错了什么? PS这是我第一次加入!! 谢谢!

编辑(这个问题跟随另一个问题[display data from database in a specific order: php or mysql?。在阅读了Gravel,Robbie Averill,Maximus2012和Miken32的答案后,我明白这是一个更好的设计,有一个专用的表格式,并使用外国关键在电话表。想到这是一个完全不同的情况,我问了这个新问题。如果有人认为这是重复的并且有办法加入2个问题,我会做的。再次感谢所有参加者是时候帮助我了。)

2 个答案:

答案 0 :(得分:2)

使用AND而不是WHERE

SELECT *
FROM phonetype
LEFT JOIN phone
ON phonetype.phonetypeID=phone.phonetypeID
AND phone.peopleID = ?

答案 1 :(得分:2)

在您的查询中;

SELECT *
FROM phonetype
LEFT JOIN phone
ON phonetype.phonetypeID=phone.phonetypeID
where phone.peopleID = ?

...在最右边的表中带有条件的WHERE子句将删除最右边的表没有值的所有行,否定LEFT JOIN

您最想要的是将条件添加到LEFT JOIN的{​​{1}}子句中,允许ON的空值仍然显示;

phone