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

时间:2014-03-27 19:29:49

标签: php mysql sql database innodb

我有一个描述表,其中包含某些描述以及唯一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;

然而,这不起作用,请有人指出我正确的方向吗?

3 个答案:

答案 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就不会知道我们正在谈论哪一个。)

请注意,如果外键列OUTERLEFT具有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。其他别名在语句的实际执行中没有任何区别,它们就在那里,因为我遵循相同的模式来处理更复杂查询的简单查询。