2010-03-19 68 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