为什么COALESCE以这种方式订购?

时间:2015-07-01 15:47:04

标签: php mysql

我有一个包含三列的表,id,comment和parent。如果父id为null,则注释是根注释,如果不是,则表示注释是对另一个注释的回复。我使用以下查询:

SELECT * 
FROM  `comment` 
ORDER BY COALESCE( parent, id ) DESC 
LIMIT 0 , 30

此查询会根据其回复对最后插入的评论进行排序,但我不了解逻辑。为什么这样订购?

enter image description here

2 个答案:

答案 0 :(得分:5)

COALESCE()函数返回收到的first non-null argument。因此,如果您浏览每一行并比较父/ id列,您会看到它的排序如下:

7 (because parent is null)
2 (because parent is null)
2 (parent is not null, so it is used)
1 (because parent is null)
1 (parent is not null, so it is used)
1 (parent is not null, so it is used)

按照您的指定,按降序排列。

我怀疑这里可能会有些混乱。所以让我重申一下。 COALESCE(parent, id)将返回 not null 中的第一个值。如果parent不为null,则返回它。如果为null,则返回id并返回该值。如果你并排查看这些行的列表并查看返回值,可能会更清楚:

| parent | id | return_value |
+--------+----+--------------+
|  null  | 7  |       7      |
|  null  | 2  |       2      |
|  2     | 4  |       2      |
|  null  | 1  |       1      |
|  1     | 3  |       1      |
|  1     | 5  |       1      |
|  1     | 6  |       1      |

答案 1 :(得分:0)

也许你的查询应该是

SELECT * 
FROM  `comment` 
ORDER BY parent DESC, id DESC 
LIMIT 0 , 30;

首先按父级排序(在整数后排序为NULL)

4653

然后

按ID按相反顺序排序

721

那会给出

4 6 五 3 7 2 1

这是你在找什么?