我有一个描述表,其中包含某些描述以及唯一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;
然而,这不起作用,请有人指出我正确的方向吗?
答案 0 :(得分:2)
如果我理解正确,您想要为同一个对象加入两次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,它就不会显示整个记录。
答案 1 :(得分:0)
尝试运行此功能(可能需要稍作调整):
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;
答案 2 :(得分:0)
您似乎需要两个对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
值的来源。
我们使用短别名而不是表名来引用每个表中的列。
基本上,考虑对objDescID
表的引用,就像它是两个不同的表一样,即使它实际上是同一个表。
请注意,我们必须为至少一个对Description的引用分配一个别名,以便我们可以区分它们。 (否则,如果我们只说objLocID
,MySQL就不会知道我们正在谈论哪一个。)
请注意,如果外键列OUTER
或LEFT
具有NULL值,或者引用的表中不存在匹配值,则查询将不会从Object返回该行。
为确保即使未找到匹配值,您也会从Object获取一行,您可以通过添加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
关键字来使用{{1}}联接操作。
例如:
{{1}}
请注意,实际上只需要一个别名,但我倾向于为查询中的所有行源分配短别名。这使得语句更难以辨认,如果我以后需要添加对已经使用的表的另一个引用,或者我需要用不同的表名或内联视图(或子查询)替换其中一个表名,这确实很有帮助。 ,我可以保留别名相同,只更改rowsource。其他别名在语句的实际执行中没有任何区别,它们就在那里,因为我遵循相同的模式来处理更复杂查询的简单查询。