2016-01-21 134 views
0

我有2个表的MySQL LEFT JOIN不会返回所有左表行

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这是我第一次加入! 谢谢!我在阅读Gravel,Robbie Averill,Maximus2012和Miken32的答案之后,明白这是一个更好的设计,它有一个专用的表格phonetype,并且在外部使用一个外键电话桌上,认为这是一个完全不同的场景,我问了这个新问题,如果有人认为这是重复的,并且有一种方法可以加入这个问题,我会这样做,再次感谢所有花时间帮帮我吧。)

+0

您能否更清楚一点?你能否把你的两个表格数据放在一起!? – KinjalMistry

+0

很难确定没有数据,但只是用'和'替换'where'看起来可以解决问题。 –

+0

[显示来自数据库的数据以特定顺序:php或mysql?]的可能重复(http://stackoverflow.com/questions/34911866/display-data-from-database-in-a-specific-order-php- or-mysql) – Gavriel

回答

1

在查询;

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 = ? 
+0

相同的结果!有用!谢谢!!并感谢您解释为什么它的作品! – codeispoetry

2

使用和代替WHERE

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

谢谢SIDU !!有用! – codeispoetry

+0

只需添加一些解释。 'WHERE'过滤'JOIN'后的结果,这就是为什么你只能得到与ID匹配的行。看看我的意思是试试'WHERE phone.peopleID =? AND phone.peopleID IS NULL',您将得到与SIDU –