2

所以我正在寻找解决以下查询:

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

因此,在 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 嵌套顺序?

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

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

4

1 回答 1

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进行测试

于 2013-03-06T20:49:54.280 回答