我的名为categories
的SQL表具有以下结构:
CREATE TABLE categories(
id int NOT NULL AUTO_INCREMENT,
parent_id int,
name varchar(50),
PRIMARY KEY(id)
);
我想知道是否可以加入同一个表并显示parent_id
名称。我可以通过PHP代码执行此操作,但由于性能问题,我希望将其作为SQL查询进行检索。
我设法加入了桌子,但不知何故,价值观并不正确。例如,SQLFiddle的结果检索:
ID | Name | Parent Category Name
-----------------------------------
1 Meats Steaks
哪个错了,应该是:
ID | Name | Parent Category Name
-----------------------------------
3 Steaks Meats
答案 0 :(得分:3)
使用INNER JOIN
代替LEFT JOIN
,您必须加入id
等于另一个表的parent_id
,如下所示:
SELECT c.id, c.name, parents.name AS `Parent Category Name`
FROM categories AS c
INNER JOIN categories AS parents ON parents.id = c.parent_id
ORDER BY c.name ASC;
这会给你:
| ID | NAME | PARENT CATEGORY NAME |
|----|--------|----------------------|
| 3 | Steaks | Meats |
如果您想要包含没有父级的类别,请使用LEFT JOIN
代替INNER JOIN
。
答案 1 :(得分:2)
当然你可以自我加入。要使语法起作用,您需要使用别名:
select c.id, c.name, cp.name as parent_category_name
from categories c left join
categories cp
on c.parent_id = cp.id;
在您的查询中,您只是在错误的方向上进行连接。我建议您使用比category
和cat
更有意义的表别名。在上面cp
旨在成为父级的行。
您的on
条款应为:
SELECT category.id, category.name, cat.name AS `Parent Category Name`
FROM categories category LEFT JOIN
categories cat
ON cat.id = category.parent_id
ORDER BY category.name ASC
答案 2 :(得分:0)
尝试以下:
SELECT a.id, a.name,(select b.name from categories b where b.id=a.parent_id) AS `Parent Category Name`
FROM categories a