繁体   English   中英

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

[英]mysql left join not return all left table row

我有2张桌子

phonetype:
phonetypeID (PK)
phonetyepe

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

对于特定的peopleID,我想返回所有电话类型,如果peopleID的号码重复,则为空,如果不为空。 就像是:

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这是我的第一次加入! 谢谢!!

编辑(此问题紧随其他问题之后[ 以特定顺序显示数据库中的数据:php或mysql?。在阅读了Gravel,Robbie Averill,Maximus2012和Miken32的答案后,我知道拥有专用表电话类型是一种更好的设计,然后在电话表中使用外键。以为这是完全不同的情况,我问了这个新问题。如果有人认为这是重复的,并且有办法加入第二个问题,我会做的。再次感谢所有花时间帮助我的人。)

使用AND而不是WHERE

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

在您的查询中;

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

...在最右边的表上有条件的WHERE子句将删除最右边的表没有值的所有行,从而消除LEFT JOIN

您最可能想要的是改为将条件添加到LEFT JOINON子句中,以允许phone的空值仍然显示。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM