Mysql 如何正确使用JOIN?

Mysql 如何正确使用JOIN?,mysql,database,join,Mysql,Database,Join,我有两个表和一个外键索引表: 表xymply\u位置 身份证件 名称 拉特 液化天然气 我想选择分配给locid 1的类别。我怎么做,我试过了 SELECT * FROM `xymply_categoryf_key`, xymply_categories JOIN `xymply_categories` ON xymply_categories.id = xymply_categoryf_key.catid WHERE locid = 1; 但是我得到了“不是唯一的表/

我有两个表和一个外键索引表: 表xymply\u位置 身份证件 名称 拉特 液化天然气

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

SELECT * 
FROM `xymply_categoryf_key`, xymply_categories 
JOIN `xymply_categories` ON
        xymply_categories.id = xymply_categoryf_key.catid 
WHERE locid = 1; 
但是我得到了
“不是唯一的表/别名:'xymply_categories'”
,我想知道为什么

代码中混合了隐式(FROM子句中列出的所有表)和显式联接样式,因此出现了错误

SELECT xc.id, xc.name
    FROM xymply_categories xc
        INNER JOIN xymply_categoryf_key xck
            ON xc.id = xck.catid
    WHERE xck.locid = 1;
因为您要两次“加入”xymply_类别,所以db需要表的别名,以便在选择列时知道要转到哪个别名

根据需要,您可以通过多种方式进行连接。一个笔直的内部连接(看起来是您想要的)可以是


或者你也可以像Joe Stefanelli展示的那样进行显式的内部连接。这两种方法中的任何一种都会提供记录,其中每个表都有匹配的信息

在查询中,您从两个表中进行选择。其中一个是
xymply\u categoryf\u key
,另一个是
xymply\u categories
的两个实例的
JOIN
。您使用的是同一个表的两个实例,因此当您编写
xymply\u categories.id
时,不清楚您指的是哪个实例-是
JOIN
的第一个参数,还是第二个参数?这就是
“非唯一表/别名”
的意思。如果我正确理解您想要做什么,请尝试以下操作:

SELECT c.id, c.name FROM xymply_categories c, xymply_categoryf_key k WHERE c.id = k.catid AND k.locid = 1;
这是在没有联接的情况下完成的,尽管

WHERE c.id = k.catid
加入
可能会更快,我不确定。另外,请注意使用
k
c
作为表
xymply\u categoryf\u key
k
表示key)和
xymply\u categories c
c
表示categories)的别名。这就是如何避免以前出现的“表/别名不唯一”问题。在你的情况下,你会使用

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

因此,尽管我给出了一个示例,说明如何在不使用
JOIN
的情况下编写查询-正如我所提到的,使用
JOIN
可能会生成更快的查询。因此,您所要做的就是添加别名。

您实际上要做两个连接,一个是隐式连接来自
表的两个
,另一个是显式连接。因此,您已经包含了两次xymply_类别,这导致了您的错误。
WHERE c.id = k.catid
xymply_categories a JOIN xymply_categories b WHERE a.id = ...