2011-02-25 69 views
1

我需要在8個表中做一個SELECT,但結果不是我所期望的。多表MySQL查詢返回的結果太多

醜陋的代碼:

SELECT equipment.* 
FROM equipment 
LEFT JOIN equip_adaptador a ON (a.cod_equip = equipment.cod_equip) 
LEFT JOIN equip_antena aa ON (aa.cod_equip = equipment.cod_equip) 
LEFT JOIN equip_cable c ON (c.cod_equip = equipment.cod_equip) 
LEFT JOIN equip_conector cc ON (cc.cod_equip = equipment.cod_equip) 
LEFT JOIN equip_fonte f ON (f.cod_equip = equipment.cod_equip) 
LEFT JOIN equip_router r ON (r.cod_equip = equipment.cod_equip) 
LEFT JOIN equip_suporte s ON (s.cod_equip = equipment.cod_equip) 
WHERE equipment.cod_equip = 'EC726026316A0' 

結果是63項,是不對的。

Explainig上面的代碼:

我的表equipment是我主表,在那裏我有cod_equip field(主場我所有從表)。

我所有的從表我已經給了一個叫equip_前綴(是在總 7個從表)

現在我需要一個SELECTJOIN所有8臺。

添加更多:

我期待9行,但它獲取63行,我需要表現出這樣的事情:表設備(只有1行)和其他表尊重號吧擁有。

例如equip_adaptador插入具有相同cod_equip兩次,然後我需要表現出來..

該查詢是一樣的,如果我做逐一查詢,看看我有什麼與equipment.cod_equip ='EC726026316A0'

就是這樣!

在此先感謝人!

+0

是什麼讓你覺得這是不對的?你有多少行? – Dismissile 2011-02-25 20:48:06

+0

預期結果是什麼?編輯:Aww打敗了我25秒 – Shaded 2011-02-25 20:48:30

+0

@Dismissile我期待9行,但它取得63行,我需要顯示這樣的東西:設備(只有1行)和其他表的尊重號碼擁有。例如equip_adaptador是兩次插入相同的cod_equip,然後我需要顯示它.. – B4NZ41 2011-02-25 21:00:35

回答

2

發生了什麼事是,每一行從每一行與其他子表返回的子表匹配返回。

正如您所期望的那樣,您有一個父行被返回。但是,如果其中一個子表具有七(7)個匹配行,而另一個子表具有九(9)個匹配行,則會返回7 * 9 = 63行。

這是每個SQL規範的預期結果集。

下面是一個說明發生了什麼測試用例:

CREATE TABLE t (id INT); 
CREATE TABLE c1 (id INT, t_id INT); 
CREATE TABLE c2 (id INT, t_id INT); 

INSERT INTO t VALUES (1); 
INSERT INTO c1 VALUES (11,1),(12,1); 
INSERT INTO c2 VALUES (21,1),(22,1); 

SELECT t.id, c1.id AS c1, c2.id AS c2 
FROM t 
JOIN c1 ON (t.id = c1.t_id) 
JOIN c2 ON (t.id = c2.t_id) 

id c1 c2 
-- --- --- 
1 11 21 
1 12 21 
1 11 22 
1 12 22 

注意,從C1行重複,一次從C2的每一行。對於來自c2的行也是如此。

這正是我們所期望的結果集。

如果我們不希望孩子行的交叉連接(笛卡爾乘積),我們可以運行單獨的查詢:

SELECT t.id, c1.id AS c1 
FROM t 
JOIN c1 ON (t.id = c1.t_id) 

SELECT t.id, c2.id AS c2 
FROM t 
JOIN c2 ON (t.id = c2.t_id) 

id c1 
-- --- 
1 11 
1 12 

id c2 
-- --- 
1 21 
1 22 

這是爲了避免產生「重複」子行的一種方式。

+0

非常感謝您的解釋,我明白髮生了什麼,現在我將使用多選(運行單獨的查詢)來展示我需要的東西,我認爲是唯一的方法。您的回覆已被接受。再次感謝。 – B4NZ41 2011-02-26 00:54:09

5

你的ON子句應該對你加入的表有約束。目前他們沒有。因此,例如,您將在equip_adaptador.cod_equip = equipment.cod_equip的所有情況下加入equip_fonte。這個陳述的真相與equip_fonte中發生的事情沒有任何關係。

+0

好眼睛。甚至沒有注意到:) – Dismissile 2011-02-25 20:49:51

1

也許在連接條件烏爾表名是錯誤的... 試試這個

SELECT equipment.* 
    FROM equipment 
    LEFT JOIN equip_adaptador a ON (a.cod_equip = equipment.cod_equip) 
    LEFT JOIN equip_antena aa ON (aa.cod_equip = equipment.cod_equip) 
    LEFT JOIN equip_cable c ON (c.cod_equip = equipment.cod_equip) 
    LEFT JOIN equip_conector cc ON (cc.cod_equip = equipment.cod_equip) 
    LEFT JOIN equip_fonte f ON (f.cod_equip = equipment.cod_equip) 
    LEFT JOIN equip_router r ON (r.cod_equip = equipment.cod_equip) 
    LEFT JOIN equip_suporte s ON (s.cod_equip = equipment.cod_equip) 
    WHERE equipment.cod_equip = 'EC726026316A0' 
+0

我發佈了錯誤的sql代碼,很抱歉,但是您修復了表名,謝謝。你的代碼返回給我113行,仍然錯了我正在尋找的結果.. – B4NZ41 2011-02-25 21:02:53

+0

@Fernando哥斯達黎加:你做一個左外連接...這將返回設備表中的所有行..是你尋找正常的連接? – Mulki 2011-02-25 21:16:21

+0

LEFT OUTER JOIN返回給我的結果與LEFT JOIN相同。 只有連接返回給我一個錯誤。 – B4NZ41 2011-02-25 21:27:46