父表中的两个外键引用相同的子表。如何构建INNER JOIN?

时间:2013-03-24 10:22:58

标签: mysql sql join

为简单起见,我会在这里将我的问题描述为理论。

想象一下,你有两个表 - MATCHES和FIGHTERS。 '战士'有一个战士列表(pk_fighter_id,战斗机名称),其中任何两个都可以安排互相攻击。 '匹配'可能是一个三字段表(pk_fight_num,fk_fighter_id1,fk_fighter_id2),它跟踪这些配对。 Fighter1和Fighter2是引用Fighters表中条目的外键。

我需要获得所有战斗的清单,以显示谁在战斗谁,即“23123 | Pacquaio | Marquez。”我如何构建我的查询呢?

我想象的是:

select fk_fighter_id1, fk_fighter_id2
from matches
inner join fighters on matches.fk_fighter_id1=fighters.pk_fighter_id
inner join fighters on matches.fk_fighter_id2=fighters.pk_fighter_id;

当我在Access中尝试模拟它时,我将它拼凑在一起,但它不起作用:

SELECT matches.match_no, fighters.fighter_name, fighters.fighter_name
FROM fighters 
INNER JOIN matches ON (fighters.fighter_id = matches.fighter2) AND (fighters.fighter_id = matches.fighter1);

那么,有什么想法吗?我只是不知道从哪里开始。

2 个答案:

答案 0 :(得分:7)

你接近你想要的。您只需要为表以及具有相同名称的投影列定义唯一的别名。

select  a.pk_fight_num,
        b.fighter_name firstFighter, -- <<== needed also
        c.fighter_name secondFighter -- <<== needed also
from    matches a
        inner join fighters b 
            on a.fk_fighter_id1 = b.pk_fighter_id
        inner join fighters c 
            on a.fk_fighter_id2 = c.pk_fighter_id;

在列名称上添加别名的原因只是为了能够识别谁是战斗机1和战斗机2。

答案 1 :(得分:6)

如果您加入两次表格,则必须为其添加别名。或者数据库不知道您使用fighters表示哪个表。例如:

select *
from matches m
inner join fighters f1 on m.fk_fighter_id1 = f1.pk_fighter_id
inner join fighters f2 on m.fk_fighter_id2 = f2.pk_fighter_id

fighters的第一个联接别名为f1,第二个加入f2