示例表如下:如何在涉及复合外键的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