[英]MySQL : SELECT results from four different tables in one query
我有四個不同的表,一個主要的SPECIAL
表只包含引用CONTRACT
和PHONE
表的ID。
我的查詢如下所示:
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
。
誰能給我指出正確的方向? 我似乎無法幫助自己進行Google搜索。
INNER JOIN僅返回兩個連接表中至少有一個匹配項可用的行。 問題是您要將4個表連接在一起。 因此,如果僅將特殊內容與ugets聯接,則可能會有更多記錄(超過1條),但是如果與其他表聯接,則這些記錄將被過濾掉。
如果不需要電話或合同中每個特殊條目的現有記錄,則將這兩個表的聯接類型更改為左聯接。 (如biziclop博士的評論所暗示的未明確)
通常,您應該考慮哪些聯接數據是可選的,哪些是必需的。 您的示例查詢需要表的所有數據。 也許這不是您想要的。
您的查詢看起來正確,除非您也希望所有行,無論是否存在contract
或phone
。 在這種情況下,您將要使用OUTER JOIN
或LEFT 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
,但是將顯示匹配項中表的所有行。
請注意,這可能會對性能產生不利影響(可能在一定程度上喪失了在單個查詢中獲取所有四個表的好處)-您應該評估收益與成本的關系,並查看是否仍需要單個查詢。
作為LEFT JOINing的替代方法,您可以考慮使用UNION ALL來連接三個查詢的結果,每個內部將specials
表連接到其他三個表之一。
這將確保您只對specials
表上的每一行返回n(1)+ n(2)+ n(3)行,而不是n(1)* n(2)* n(3)行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.