2011-08-03 14 views
1

我在一个表上有两列引用第二个表上的同一列以获取与指定的ID相关的名称。如何执行从两个不同的列到单独的表上的同一列的联接

以下是我正在使用的查询不起作用。关于invTypes的两个LEFT JOINS会导致问题。我已阅读和阅读,并一直在我的脑子里这个。我不能为我的生活弄清楚如何使这个返回属于主表中两个单独位置的ID的名称。

要注意的事项与进行张榜整个数据库的结构(这是巨大的)

两个typeIDitemTypeID存在于主表。这些引用中的每一个都与invTypes表中的typeID列相同。 invTypes表包含与所述ID相对应的名称。

此外,在声明的SELECT部分​​,typeName来自invTypesstationName来自staStations表。

主要问题是,如果invTypes。 typeName被从两列引用两次,我如何1:正确地将表加入这两个点和2:我如何分辨两个invTypes中的差异。 typeName如果可以创建两个JOIN语句,则返回。

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 

我想提前道歉,因为我的问题是格式不正确,没有组织。我对一个解决方案感到不知所措,甚至很难问这个问题。另外,我想提前感谢您提供的任何建议。

+0

一些示例数据将有助于理解从外观上来看这更好的原因似乎是,'typeID'和'itemTypeID'拥有的每一行中相同的值eve_container_audit? –

+0

确定itemTypeID引用容器类型,并且typeID引用容器内的项目,但是,两个id都从另一个表上的相同位置获得名称。我希望这有帮助。由于表格很大,并且与手头的问题相关的问题有很多无关紧要的东西,因此要真实地表示数据是非常困难的。由于容器和其中的项目都是相同的项目,所以它们以相同的方式从相同的项目数据库中获得名称 – Wes

回答

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 
+0

第二个查询的工作方式类似于魅力。非常感谢你。你的例子在将来会非常帮助我理解如何使用别名,这些别名恰好是我很努力的事情。 – Wes

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 
+0

#1064 - 您的SQL语法错误;检查与您的MySQL服务器版本相对应的手册,以便在第2行使用'inv2.'typeName'附近的正确语法作为sub_type,'actorName','stationName','action','passwordType', ' – Wes

+0

@Wes我在那里错过了一个逗号,请尝试更新的查询 –

+0

谢谢你的更正。这也像一个魅力。我已经标记了一个正确的,但我已经+ 1ed雅。非常感谢你。这个答案将有望帮助我和其他人搜索本网站,希望了解别名如何工作。 – Wes

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 
... 
+0

#1054 - 'on子句'中的未知列'invTypes.typeID'我不知道为什么它说未知列,因为它确实存在。 – Wes

+0

已编辑。我忘记了将'invTypes'更改为'invtypes1'。 – Hammerite

相关问题