[英]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将不知道我们正在谈论哪一个。)
请注意,如果外键列objDescID
或objLocID
具有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.