【问题标题】:MySQL category with parent_id - SELF Join带有 parent_id 的 MySQL 类别 - 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

【问题讨论】:

    标签: mysql sql self-join


    【解决方案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;
    

    这会给你:

    | 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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-03-02
          • 1970-01-01
          • 2015-07-10
          • 2011-05-26
          • 1970-01-01
          • 2012-04-30
          • 1970-01-01
          相关资源
          最近更新 更多