我有两个表和一个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' "
,我想知道为什么......?
答案 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
可能会更快,我不确定。另请注意,使用k
和c
作为表xymply_categoryf_key
(密钥为k
)和xymply_categories c
(c
类别的别名)。这是如何避免之前发生过的“不唯一的表/别名”问题。在你的情况下,你会使用例如。
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所示那样进行明确的内部联接。这些中的任何一个都会为您提供每个表中存在匹配信息的记录。