用两个外键连接两个表


Joining two tables together with two foreign keys

我有一个Description表,其中包含特定的描述以及唯一的ID。我有另一个表,它包含这个表的两个外键。到目前为止,我有以下查询:

SELECT
Description.description AS Description,
Object.objID AS ID,
Description.description AS Location
FROM
Object
INNER JOIN
Description
ON
Object.objDescID=Description.descID
AND
Object.objLocID=Description.descID;

然而,这是不工作,请有人能指出我在正确的方向?

如果我理解正确的话,您想为同一对象两次加入Description表。试一试,看看它是否能让你得到你想要的:

SELECT
  Object.objID AS ID,
  od.description AS Description,
  ld.description AS Location
FROM Object
  INNER JOIN Description AS od
    ON Object.objDescID=od.descID
  INNER JOIN Description AS ld  
    ON Object.objLocID=ld.descID;

编辑:一个忠告,如果你允许空外键,你应该使用LEFT JOIN而不是INNER JOIN,这样,如果其中一个是空的,它不会保持整个记录显示

试着运行这个(可能需要稍作调整):

SELECT
Description.description AS Description,
Object.objID AS ID,
Description.description AS Location
FROM
Object
INNER JOIN
Description AS Object.objDescID=Description.descID
INNER JOIN 
Description AS Object.objLocID=Description.descID;

看起来您需要两个Description表的引用。每个引用将使用一个外键列连接。

例如:

SELECT o.objID        AS `ID`
     , d.description  AS `Description`
     , l.description  AS `Location`
FROM Object o
JOIN Description d
  ON d.descID = o.objDescID
JOIN Description l
  ON l.descID = o.objLocID 

我们为获取Description值的源指定短别名d

我们为获取Location值的源指定短别名l

我们使用短别名而不是表名来引用每个表中的列。

从本质上讲,可以把对Description表的引用看作是两个不同的表,尽管它们实际上是同一个表。

注意,我们必须为Description的至少一个引用分配别名,以便我们可以区分它们。(否则,如果我们只说Description.description, MySQL将不知道我们在谈论哪个。)

请注意,如果外键列objDescIDobjLocID的值为NULL,或者在引用表中不存在匹配的值,则查询将不会返回Object中的行。

为了确保即使没有找到匹配的值也能从Object中获得一行,您可以通过包含LEFT关键字来使用OUTER连接操作。

例如:

SELECT o.objID        AS `ID`
     , d.description  AS `Description`
     , l.description  AS `Location`
FROM Object o
LEFT
JOIN Description d
  ON d.descID = o.objDescID
LEFT
JOIN Description l
  ON l.descID = o.objLocID 

注意,实际上只需要一个别名,但我倾向于为查询中的所有行源分配短别名。这使语句更易于理解,并且在以后需要向已使用的表添加另一个引用时,或者需要用不同的表名或内联视图(或子查询)替换其中一个表名时,确实很有帮助,我可以保持别名不变,只更改行源。其他别名在语句的实际执行中没有任何区别,它们只是在那里,因为我对简单查询遵循的模式与对更复杂查询遵循的模式相同。