带有parent_id的MySQL类别 - SELF加入

时间:2014-11-20 12:33:18

标签: mysql sql self-join

我的名为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

3 个答案:

答案 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;

在您的查询中,您只是在错误的方向上进行连接。我建议您使用比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

答案 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