簡體   English   中英

MySQL:在一個查詢中從四個不同表中選擇結果

[英]MySQL : SELECT results from four different tables in one query

我有四個不同的表,一個主要的SPECIAL表只包含引用CONTRACTPHONE表的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博士的評論所暗示的未明確)

通常,您應該考慮哪些聯接數據是可選的,哪些是必需的。 您的示例查詢需要表的所有數據。 也許這不是您想要的。

您的查詢看起來正確,除非您也希望所有行,無論是否存在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 ,但是將顯示匹配項中表的所有行。

請注意,這可能會對性能產生不利影響(可能在一定程度上喪失了在單個查詢中獲取所有四個表的好處)-您應該評估收益與成本的關系,並查看是否仍需要單個查詢。

作為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM