2012-04-02 88 views
1

我有四個不同的表,一個主要SPECIAL表只包含參照CONTRACTPHONE表的id。MySQL:在一個查詢中選擇來自四個不同表的結果

我的查詢如下所示:

SELECT * 
FROM `specials` specials 
INNER JOIN `contract` contracts 
ON specials.contract_id = contracts.id 
INNER JOIN `phone` phones 
ON specials.phone_id = phones.id 
INNER JOIN `ugets` ugets 
ON specials.id = ugets.special_id 

目前,該只得到一列從UGETS表,但我需要從這個特定表中的所有行與正確special_id

任何人都可以請指點我正確的方向嗎?我似乎無法幫助自己搜索它。

+0

如果您發出更簡單的查詢,會發生什麼情況 - 在specials.id = ugets.special_id中選擇特殊內部連接ugets?你有多少行?儘量不要使用'select *',特別是對於多表連接。 – 2012-04-02 07:45:37

+0

'LEFT JOIN'而不是'INNER JOIN'? – biziclop 2012-04-02 07:46:02

+0

請抽取數據集? – Romain 2012-04-02 07:53:40

回答

1

您的查詢看起來正確,除非您還想要所有行,無論是否存在contractphone。在這種情況下,你需要使用OUTER JOINLEFT JOIN代替INNER JOIN

SELECT * 
FROM `specials` specials 
LEFT JOIN `contract` contracts 
ON specials.contract_id = contracts.id 
LEFT JOIN `phone` phones 
ON specials.phone_id = phones.id 
LEFT JOIN `ugets` ugets 
ON specials.id = ugets.special_id 

字段從那裏並沒有對給予特別將NULL返回一個記錄表,但表中的所有行,其中有一個比賽將顯示。

請注意,這可能會對性能產生不利影響(可能會導致在單個查詢中獲取所有四張表的好處) - 您應該評估收益與成本,並確定您是否仍想要單個查詢。

+0

謝謝你,這可以工作,但它會爲'ugets'和'special_id'的兩個實例返回多行。我意識到這是LEFT JOIN應該做的事情,但是有沒有辦法返回多行,而只是返回同一行中的兩個'ugets'實例的數組值呢? – 2012-04-02 11:05:18

+1

看起來你試圖讓SQL像Turing完全語言一樣行事。有些東西在應用程序代碼中更好,而不是DB端。你可以使用'GROUP_CONCAT'來實現你想要的,但是我會反對它(不可移植,...)。 – Romain 2012-04-02 11:33:16

+0

我選擇運行一個單獨的函數來稍後在我的腳本中檢索值。感謝您的建議。 – 2012-04-07 14:49:49

3

INNER JOIN只返回兩個連接表中至少有一個匹配項可用的行。問題在於你將4個表連接在一起。因此,如果您僅通過ugets加入特價商品,則可能會有更多記錄(超過1個),但如果您加入其他表格,則會將這些記錄過濾掉。

如果沒有必要爲電話或合同中的每個特殊條目存在記錄,則將這兩個表的連接類型更改爲左連接。 (由博士biziclop的評論暗示)

一般來說,您應該考慮哪些加入的數據是可選的,哪些是必需的。您的示例查詢需要您的表的所有數據。也許這不是你想要的。

+0

所以,我收集,如果INNER JOIN在'SPECIAL'表中有相同的'special_id'對應'id',那麼INNER JOIN將不會從'UGET'返回兩行或更多行。 – 2012-04-02 10:53:16

+0

如果只有內部加入SPECIAL和UGET,那麼您應該根據您的加入條件接收SPECIAL和UGET中所有可能的記錄組合。這意味着UGET中具有相同字段值special_id的記錄將導致結果集中的單獨記錄。如果你希望它們僅限於SPECIALS中每個special_id的一個連接,那麼你必須對你的記錄進行分組(這將限制你的可選列到分組或集合的列),或者你確定一個在子查詢中具有這個special_id的UGET ID並添加一個條件以匹配該ID。 – TRD 2012-04-02 11:35:56

1

作爲LEFT JOINing的替代方案,您可以考慮使用UNION ALL加入三個查詢的結果,每個查詢的內部結合specials表與其他三個表中的一個。

這將確保您只返回n(1)+ n(2)+ n(3)行。

相關問題