如何从一个单独的表上的两个不同列到同一列进行JOIN

时间:2011-08-03 01:47:40

标签: mysql sql join

我在一个表上有两列引用第二个表上的同一列,以获取与指定ID相关的名称。

以下是我正在使用的查询无效。 invTypes上的两个LEFT JOINS会导致问题。我已阅读并阅读,并且一直在为此而绞尽脑汁。我不能为我的生活找出如何让它返回属于主表中两个不同位置出现的ID的名称。

要注意不要发布整个数据库结构(这是巨大的)

主表上存在typeIDitemTypeID。其中每个引用typeID表中的相同invTypes列。 invTypes表包含与所述ID对应的名称。

此外,在语句的SELECT部分​​中,typeName来自invTypesstationName来自staStations表。

主要问题是,如果从两列引用两次invTypes。typeName,我如何1:正确地将表连接到这两个点,2:我如何区分两者如果可以生成两个JOIN语句,则返回invTypes。typeName

SELECT 
`logTime`,`itemID`,`typeName`,`actorName`,`stationName`,`action`,`passwordType`,
`quantity`,`oldConfiguration`,`newConfiguration` 
        FROM eve_container_audit 
        LEFT JOIN invTypes ON eve_container_audit.typeID = invTypes.typeID
        LEFT JOIN invTypes ON eve_container_audit.itemTypeID = invTypes.typeID

        LEFT JOIN staStations ON eve_container_audit.locationID = staStations.stationID

3 个答案:

答案 0 :(得分:1)

以下是如何加入它们一次:

SELECT 
  `logTime`,
  `itemID`,
  `typeName`,
  `actorName`,
  `stationName`,
  `action`,
  `passwordType`,
  `quantity`,
  `oldConfiguration`,
  `newConfiguration` 
FROM
  eve_container_audit 
LEFT JOIN
  invTypes
ON
  eve_container_audit.typeID = invTypes.typeID and
  eve_container_audit.itemTypeID = invTypes.typeID
LEFT JOIN
  staStations
ON
  eve_container_audit.locationID = staStations.stationID

如果您需要加入两次,请使用别名:

SELECT 
  `logTime`,
  `itemID`,
  `typeName`,
  `actorName`,
  `stationName`,
  `action`,
  `passwordType`,
  `quantity`,
  `oldConfiguration`,
  `newConfiguration` 
FROM
  eve_container_audit 
LEFT JOIN
  invTypes
ON
  eve_container_audit.typeID = invTypes.typeID
LEFT JOIN
  invTypes invTypes2
ON
  eve_container_audit.itemTypeID = invTypes2.typeID
LEFT JOIN
  staStations
ON
  eve_container_audit.locationID = staStations.stationID

答案 1 :(得分:1)

试试这个。基本上创建同一个表的第二个别名。在选择中,请专门引用inv1或inv2以获取正确的值。

SELECT 
     `logTime`,`itemID`, inv1.`typeName` as main_type , inv2.`typeName` as sub_type, `actorName`,`stationName`,`action`,`passwordType`,
     `quantity`,`oldConfiguration`,`newConfiguration` 
FROM eve_container_audit 
      LEFT JOIN invTypes as inv1 ON eve_container_audit.typeID = inv1.typeID
      LEFT JOIN invTypes as inv2 ON eve_container_audit.itemTypeID = inv2.typeID
      LEFT JOIN staStations ON eve_container_audit.locationID = staStations.stationID

答案 2 :(得分:1)

由于您要连接同一个表两次,因此需要为表的两个副本提供唯一的别名,否则您的查询将不明确。

...
LEFT JOIN invTypes ON eve_container_audit.typeID = invTypes.typeID
LEFT JOIN invTypes ON eve_container_audit.itemTypeID = invTypes.typeID
...

应该是

之类的东西
...
LEFT JOIN invTypes AS invtypes1 ON
    eve_container_audit.typeID = invtypes1.typeID
LEFT JOIN invTypes AS invtypes2 ON
    eve_container_audit.itemTypeID = invtypes2.typeID
...