繁体   English   中英

将两个表连同两个外键连接在一起

[英]Joining two tables together with two foreign keys

我有一个描述表,其中包含某些描述以及唯一的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,这样如果其中一个为null,它不会保持整个记录不显示。

尝试运行此功能(可能需要稍作调整):

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 

我们将短别名d分配给我们从中获取Description值的源。

我们将短别名l分配给我们从中获取Location值的源。

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

从本质上讲,考虑对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 

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM