带有 parent_id 的 MySQL 类别 - SELF Join
Posted
技术标签:
【中文标题】带有 parent_id 的 MySQL 类别 - SELF Join【英文标题】:MySQL category with parent_id - SELF Join 【发布时间】:2014-11-20 12:33:17 【问题描述】:我的名为categories
的SQL表结构如下:
CREATE TABLE categories(
id int NOT NULL AUTO_INCREMENT,
parent_id int,
name varchar(50),
PRIMARY KEY(id)
);
我想知道是否可以加入同一个表并显示parent_id
名称。我可以通过 php 代码做到这一点,但由于性能问题,我想检索为 SQL 查询。
See example at SQLFiddle
我已设法加入表,但不知何故,值不正确。例如,SQLFiddle 检索的结果:
ID | Name | Parent Category Name
-----------------------------------
1 Meats Steaks
哪个不对,应该是:
ID | Name | Parent Category Name
-----------------------------------
3 Steaks Meats
【问题讨论】:
【参考方案1】:使用INNER JOIN
而不是LEFT JOIN
,您必须加入等于另一个表的parent_id
的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;
SQL Fiddle Demo
这会给你:
| ID | NAME | PARENT CATEGORY NAME |
|----|--------|----------------------|
| 3 | Steaks | Meats |
如果您想包含那些没有父类别的类别,请使用 LEFT JOIN
而不是 INNER JOIN
。
【讨论】:
【参考方案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
【讨论】:
【参考方案3】:试试下面:
SELECT a.id, a.name,(select b.name from categories b where b.id=a.parent_id) AS `Parent Category Name`
FROM categories a
【讨论】:
以上是关于带有 parent_id 的 MySQL 类别 - SELF Join的主要内容,如果未能解决你的问题,请参考以下文章