MySQL排序行组

时间:2013-02-05 18:00:32

标签: mysql group-by foreign-keys sql-order-by hierarchical-data

我有一个表 menu ,其中包含通过外键引用同一表中其他行的行。
这里的表:

+----+---------------+--------+
| id | title         | parent |
+----+---------------+--------+
| 1  | Enseignements | NULL   |
| 2  | Juments       | 4      |
| 3  | Étalons       | 4      |
| 4  | Animaux       | NULL   |
| 5  | Tarifs        | 1      |
+----+---------------+--------+

我想按照分层次和字母顺序对行进行分组,如下所示:

+----+---------------+--------+
| id | title         | parent |
+----+---------------+--------+
| 4  | Animaux       | NULL   |
| 3  | Étalons       | 4      |
| 2  | Juments       | 4      |
| 1  | Enseignements | NULL   |
| 5  | Tarifs        | 1      |
+----+---------------+--------+

我只是设法对来自同一分支的项目进行分组。子级项目按 title 排序。事实上,我希望所有的第一级项目也按 title 排序,如下所示:

+----+---------------+--------+
| id | title         | parent |
+----+---------------+--------+
| 1  | Enseignements | NULL   |
| 5  | Tarifs        | 1      |
| 4  | Animaux       | NULL   |
| 3  | Étalons       | 4      |
| 2  | Juments       | 4      |
+----+---------------+--------+

使用代码:

SELECT title, COALESCE(parent, id), parent
FROM menu
GROUP BY COALESCE(parent, id), title

我该怎么做?

1 个答案:

答案 0 :(得分:0)

SQL Fiddle

MySQL 5.5.30架构设置

CREATE TABLE Table1
    (`id` int, `title` varchar(13), `parent` varchar(4))
;

INSERT INTO Table1
    (`id`, `title`, `parent`)
VALUES
    (1, 'Enseignements', NULL),
    (2, 'Juments', '4'),
    (3, 'Étalons', '4'),
    (4, 'Animaux', NULL),
    (5, 'Tarifs', '1')
;

查询1

SELECT title, COALESCE(parent, id), parent
FROM Table1
GROUP BY 2,1
order by COALESCE(parent, id) desc,title asc

<强> Results

|         TITLE | COALESCE(PARENT, ID) | PARENT |
-------------------------------------------------
|       Animaux |                    4 | (null) |
|       Étalons |                    4 |      4 |
|       Juments |                    4 |      4 |
| Enseignements |                    1 | (null) |
|        Tarifs |                    1 |      1 |