2012-02-15 79 views
-1

我有两个表和foreign_key索引表: 表xymply_locations ID 名 纬度 LNG如何正确使用JOIN?

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' ",我想知道为什么......?

+0

你实际上会做两个连接,一个隐含两个'from'表,一个显式连接'join'。所以你有xymply_categories包括两次,导致你的错误。 – 2012-02-15 21:18:58

回答

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

因为你是如此的分贝要以知道选择列时候去到一个表的别名“加入” xymply_catagories两次。

根据您的需要,您可以采用几种方法。直内连接(这似乎是你想要的)可以

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

,或者你也可以做一个明确的内部联接为乔·斯特凡内利表示。这两种方法都可以为您提供每张表中匹配信息的记录。

1

在您的查询中,您正在从两个表中进行选择。其中一个是xymply_categoryf_key,另一个是xymply_categories两个实例的JOIN。您正在使用同一个表的两个实例,因此当您编写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 c(类别为c)的别名的用法。这是如何避免之前发生的“非唯一表/别名”问题。就你而言,你可以使用例如

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

所以,虽然我举了一个例子如何编写查询,而无需使用JOIN - 正如我所说,使用JOIN可能会产生更快的查询。因此,你应该做的就是添加别名。