2010-03-19 30 views
1

示例表如下:如何在涉及複合外鍵的MySQL中進行多表連接?

SCENARIO_NATIONS 
[scenID] [side] [nation] 

scen001  1  Germany 
scen001  2  Britain 
scen001  2  Canada 

SCENARIO_NEEDUNITS 
[scenID] [unitID] 

scen001 0001 
scen001 0003 
scen001 0107 
scen001 0258 
scen001 0759 

UNIT_BASIC_DATA 
[unitID] [nation] [name] 

    0001 Germany Mortars 
    0003 Germany Infantry 
    0107 Britain Lt 
    0258 Britain Infantry 
    0759 Canada Kilted Yaksmen 

目標:給予scenID,由side, nation, name分類數據庫提取的單位名單。

我能做的一切除了side列入搭配:

SELECT scenario_needunits.scenID, unit_basic_data.nation, unit_basic_data.name 
FROM scenario_needunits 
LEFT OUTER JOIN unit_basic_data 
ON scenario_needunits.unitID=unit_basic_data.unitID 
WHERE scenario_needunits.scenID='scen001' 
ORDER BY unit_basic_data.nation ASC, unit_basic_data.name ASC 

我試着只是刪除了SCENARIO_NATIONS表中作爲一個scenIDLEFT OUTER JOIN什麼最終情況是,ALL單位回來與side1,因爲這總是scenIDSCENARIO_NATIONS表中列出的第一面。

從概念上講,我認爲需要做的是SCENARIO_NATIONS必須連接到兩個scenID(來限制它只是場景)和各單位的nation但我沒有任何想法如何做到這一點。在每個單元


OMG小馬碼結果被列出兩次,每面一次,而不是僅針對其父國家是上側:

[scenID] [side] [nation] [name] 
BaBu001  1 America CAPT 
BaBu001  1 America HMG 
BaBu001  1 Germany CAPT 
BaBu001  1 Germany GREN 
BaBu001  2 America CAPT 
BaBu001  2 America HMG 
BaBu001  2 Germany CAPT 
BaBu001  2 Germany GREN 

正確的結果將是

[scenID] [side] [nation] [name] 
BaBu001  1 America CAPT 
BaBu001  1 America HMG 
BaBu001  2 Germany CAPT 
BaBu001  2 Germany GREN 

而要得到我們修改像這樣的代碼:

SELECT sn.side, snu.scenid, ubd.nation, ubd.unitname 
FROM sn 
JOIN snu 
     ON snu.scenid=sn.scenid AND snu.scenid = 'scenID' 
JOIN ubd 
     ON ubd.nation=sn.nation AND ubd.unitid=snu.unitid //double join is the key change 
ORDER BY sn.side, ubd.nation, ubd.unitname 
+0

我想補充一點,我對加入的知識並不瞭解,所以我有一種合理的可能性,那就是我的方法根本上是錯誤的。 – Drew 2010-03-19 04:45:41

回答

2

如果你只想與在SCENARIO_NEEDUNITS表,使用關係UNIT_BASIC_DATA行/記錄:

SELECT snu.scenid, 
     sn.side, 
     ubd.nation, 
     ubd.name 
    FROM UNIT_BASIC_DATA ubd 
    JOIN SCENARIO_NEEDUNITS snu ON snu.unitid = ubd.unitid 
           AND snu.scenid = ? 
    JOIN SCENARIO_NATIONS sn ON sn.scenid = snu.scenid 
ORDER BY snu.scenid, sn.side, ubd.nation, ubd.name 

更換?與任何scenid你想尋找。您不需要指定ASC - 這是默認設置。

+0

謝謝你清理基本查詢,但我的問題是我也希望每個單元的邊,並首先排序。每種情景都有兩個方面,我想要結果順序爲:第1方>國家>單位,然後第2方>國家>單位,而不是目前的情況,這就是國家>單位 – Drew 2010-03-19 04:56:30

+0

@安德魯希思:更新的答案。提供你想要的輸出的例子將有助於未來,因爲當我的閱讀理解失敗時。 – 2010-03-19 05:00:07

+0

感謝您的努力,但仍不完全正確,請查看我的更新後文章,查詢結果與期望結果。 – Drew 2010-03-19 05:15:23