2012-07-12 35 views
1

我似乎無法找出原因:解決不了這個SQL查詢結果

SELECT `Title`.`Title`, `FirstName`, `LastName`, `Address1`, `Address2`, `Town`.`Town`, `County`.`County`, `PostalCode`, `Phone1`, `Solo` 
FROM `Person` 
JOIN `Title` ON `Person`.`Title` = `Title`.`id` 
JOIN `Town` ON `Person`.`Town` = `Town`.`id` 
JOIN `County` ON `Person`.`County` = `County`.`id` 
WHERE `Person`.`Solo`='1' 
ORDER BY `LastName` ASC; 

返回0的結果,(它不應該,至少有5個結果,其中Solo =「1」)

如果我修改它,採取了所有的連接:

SELECT `Title`, `FirstName`, `LastName`, `Address1`, `Address2`, `Town`, `County`, `PostalCode`, `Phone1`, `Solo` 
FROM `Person` 
WHERE `Person`.`Solo`='1' 
ORDER BY `LastName` ASC; 

我得到的結果?如果我修改它取出WHERE Person.Solo='1'它也給我結果,但只有2;在哪裏,它應該返回所有的行?有人可以解釋嗎?

:)

注:Solo是一個TINYINT,它在所有的記錄equels 0或1!

回答

6

你的連接是嚴格的,這意味着如果Person沒有TitleTownCountry那麼這將不予退還。即使刪除整個WHERE子句,也不會得到任何結果。

嘗試用LEFT JOIN代替。

這是類型多麼不同連接工作很好的解釋:A Visual Explanation of SQL Joins

+0

啊哈,就是這樣!感謝您的幫助,我會再次閱讀左右和加入! :) – Chud37 2012-07-12 20:02:12

+0

@ Chud37,歡迎你)我添加了關於連接類型的文章的鏈接。 – 2012-07-12 20:05:39

1

有一些共同的規範,使您的代碼更易讀給他人。首先,總是使用id作爲(自動增量) - 主鍵。然後在相關表中使用xxxxx_id。其次,您應該使用更精確的JOIN聲明:LEFT JOIN或INNER JOIN。這更容易閱讀。第三:通常不需要使用``。除此之外,您可以使用表別名來減少SQL代碼的數量。

SELECT ti.title, firstname, lastname, address1, address2, to.town, county.county, postalcode, phone1, solo 
FROM person AS p 
LEFT JOIN title AS ti ON p.title = ti.id 
LEFT JOIN town AS to ON p.town_id = to.id 
LEFT JOIN county AS c ON p.county = c.id 
WHERE p.solo=1 
ORDER BY lastname ASC; 

只是一個建議...