2017-10-16 64 views
0

我有表cities與colums idnameregion_id和表orders與colums idcity_idMySQL的存在,或者JOIN

我需要從orders中選擇所有行,需要的地方region_id

隨着EXISTS

SELECT `o`.`id` 
FROM `orders` as `o`   
WHERE EXISTS (SELECT `id` 
       FROM `cities` 
       WHERE `id` = `o`.`city_id` AND `region_id` = ".$region_id.") 

隨着JOIN

SELECT `o`.`id` 
FROM `orders` as `o` 
LEFT JOIN `cities` as `c` ON `o`.`city_id` = `c`.`id` 
WHERE `c`.`region_id` = ".$region_id." 

什麼是在這種情況下更好?

+0

你自己的測試揭示了什麼? – Strawberry

+0

我會測試它。但我認爲在這個問題上有一些共同的意見 –

回答

0

我會說JOIN由於可讀性更好。很公平,很容易理解Exit之一,但快速瀏覽一下,它的重複性較低,且易於閱讀。

如果您從性能角度出發,我會建議您在自己的系統上進行基準測試。

如果您正在處理用戶輸入,我還建議您利用PDO。

0

你應該學會使用參數,所以你不要查詢字符串。將參數值填充到查詢字符串中可能會導致意外的語法錯誤和SQL注入漏洞。

LEFT JOIN是多餘的。你WHERE子句將外連接到內部聯接:

SELECT o.id 
FROM orders o JOIN 
    cities c 
    ON o.city_id = c.id 
WHERE c.region_id = ".$region_id." 

(。我刪除了反引號他們是不必要的,所以它們只是用來擾亂查詢)

至於哪個更好,兩個可以做不同的事情。如果cities對於相同的id具有多行,則JOIN版本可以爲給定訂單返回多行。無可否認,這不太可能出現在名爲id的列中,但語義略微偏向於EXISTS。注意:這只是因爲您沒有從c中選擇任何其他列。如果是這樣,那麼JOIN是一個不容易的事情。

在大多數情況下,選擇是一個品味問題。您可能希望運行兩個版本,檢查執行計劃,並查看哪些數據更快。