带有 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_idid,如下所示:

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;

在您的查询中,您的连接方向错误。我建议您使用比categorycat 更有意义的表别名。在上面的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的主要内容,如果未能解决你的问题,请参考以下文章

基于 parent_id 的类别的动态下拉

MySQL 类别计数

带有分层邻接模型MySql和PHP的缩进HTML下拉列表

获取所有类别(多级)

Laravel 类别、子类别和模型绑定

类别表