MYSQL使用ORDER By if,订购具有可在两个级别订购的子类别的类别

时间:2013-03-06 19:05:07

标签: php mysql

所以我想解决以下问题:

SELECT * FROM `#__gdwproddise_category` 
      ORDER BY IF(`parent_id`, `parent_id`, `ordering`), 
           `parent_id`, `ordering` asc

所以重要的MYSQL字段是:

`multicat_id` = primary key
`parent_id`
`ordering`

父类别parent_id = 0,其余为=父母的multicat_id

每个唯一的parent_id(包括= 0,因此父母)都会在ordering字段中设置唯一排序。

因此,在排序字段中,您会找到多个值为1,2,3等的行(每个值在每个parent_id内都是唯一的

like parent_id=0 will only have 1 row with ordering set to 1.
and parent_id=1 will only have 1 row with ordering set to 1.
etc.

我希望通过以下方式输出它们:

parent (ordering=1)
-child (ordering=1)
-child (ordering=2)
parent (ordering=2)
-child (ordering=1)
etc.

以下查询似乎几乎可行。但是父母不是按ordering字段排序的。他们似乎是按主键排序的。

SELECT * FROM `#__gdwproddise_category` 
     ORDER BY IF(`parent_id`, `parent_id`, `multicat_id`), 
         `parent_id`, `ordering` asc

我发布的第一个查询是我的演绎尝试修复此问题,但这不起作用......第一个查询效果更好。至少父母和孩子被分组到第一个。这第二个人将孩子的父母分组。孩子们似乎坚持不懈。

我的查询基于以下线程的答案中给出的示例: SQL nested order by?

我发现了这篇文章:http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

当我使用aLmost的查询完全符合我的要求时,使用该文章中的“ltg rtg”解决方案似乎很复杂...那篇文章似乎支持无限子类...我的系统只需要1级子类别。

1 个答案:

答案 0 :(得分:3)

因为您需要知道放置块的父级的顺序 在结果中的正确位置的子行,你可能会有 使用自我加入。

以下查询似乎给出了您想要的顺序:

SELECT C.* FROM categories AS C
LEFT JOIN categories AS P
ON P.multicat_id = C.parent_id
ORDER BY IF(P.multicat_ID, P.ordering, C.ordering),
         P.ordering, C.ordering;

可以在http://www.sqlfiddle.com/#!2/ba095/1/0

进行测试