2016-01-21 95 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 –