如何正确使用JOIN?

时间:2012-02-15 21:15:06

标签: mysql database join

我有两个表和一个foreign_key索引表:     表xymply_locations     ID     名称     LAT     LNG

table xymply_categories
id
name

table xymply_categoryf_key
locid
catid

我想选择分配给locid 1的类别。我怎么做,我试过

SELECT * 
FROM `xymply_categoryf_key`, xymply_categories 
JOIN `xymply_categories` ON
        xymply_categories.id = xymply_categoryf_key.catid 
WHERE locid = 1; 

但我得"Not unique table/alias: 'xymply_categories' ",我想知道为什么......?

3 个答案:

答案 0 :(得分:2)

您在代码中混合隐式(FROM子句中列出的所有表)和显式JOIN样式,因此错误。

SELECT xc.id, xc.name
    FROM xymply_categories xc
        INNER JOIN xymply_categoryf_key xck
            ON xc.id = xck.catid
    WHERE xck.locid = 1;

答案 1 :(得分:1)

在您的查询中,您要从两个表中进行选择。其中一个是xymply_categoryf_key,另一个是JOIN两个xymply_categories个实例。你正在使用同一个表的两个实例,所以当你写xymply_categories.id时,你不清楚你的意思是哪个实例 - JOIN的第一个参数,或者第二个参数。争论?这就是"Not unique table/alias"的含义。如果我理解你想做什么,试试这个:

SELECT c.id, c.name FROM xymply_categories c, xymply_categoryf_key k WHERE c.id = k.catid AND k.locid = 1;

这是在没有JOIN的情况下完成的,虽然评估了

WHERE c.id = k.catid
使用JOIN可能会更快,我不确定。另请注意,使用kc作为表xymply_categoryf_key(密钥为k)和xymply_categories cc类别的别名)。这是如何避免之前发生过的“不唯一的表/别名”问题。在你的情况下,你会使用例如。

xymply_categories a JOIN xymply_categories b WHERE a.id = ...

所以,虽然我给出了一个如何在不使用JOIN的情况下编写查询的示例 - 正如我所提到的,使用JOIN可能会产生更快的查询。因此,您应该做的就是添加别名。

答案 2 :(得分:0)

因为您正在“加入”xymply_catagories两次,所以db想要表的别名,以便知道在选择列时要去哪一个。

根据您的需要,您可以通过多种方式加入。直接内连接(看起来像你想要的)可以是

select * from xymply_categoryf_key a, xymply_categories b where a.catid = b.id 
WHERE b.locid = 1;

或者您也可以像Joe Stefanelli所示那样进行明确的内部联接。这些中的任何一个都会为您提供每个表中存在匹配信息的记录。