示例表如下:如何在涉及複合外鍵的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
表中作爲一個scenID
但LEFT OUTER JOIN
什麼最終情況是,ALL單位回來與side
的1
,因爲這總是scenID
在SCENARIO_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
我想補充一點,我對加入的知識並不瞭解,所以我有一種合理的可能性,那就是我的方法根本上是錯誤的。 – Drew 2010-03-19 04:45:41