GROUP BY子句中的mysql IF

use*_*000 8 mysql if-statement group-by

if in group by子句有没有办法?

我有一个查询,我想根据列的值对结果进行分组

如果列是Null,我希望结果保持原样但如果不是,我想按该值对其进行分组?你是怎样做的?

编辑:抱歉,我想我应该提一个更具体的例子

下面的列包含类别,线程和回复的ID

这是一个论坛

具有空值的那些意味着它们没有任何回复

如果回复为null,我不想将其分组

目的是计算回复和类别中的线程

我没有将回复的值设置为null,因为连接的结果,它们就是这样

| category | thread | reply   |
-------------------------------
| 1        | 1      | 1       |
| 1        | 1      | 2       |
| 1        | 2      | 3       |
| 2        | 3      | 4       |
| 3        | 4      | 5       |
| 3        | 4      | 6       |
| 4        | 5      | null    |
| 5        | 6      | null    |
Run Code Online (Sandbox Code Playgroud)

那么结果就是

| category | thread | reply |
-----------------------------
| 1        | 3      | 3     |
| 2        | 1      | 1     |
| 3        | 2      | 2     |
| 4        | 1      | null  |
| 5        | 1      | null  |
Run Code Online (Sandbox Code Playgroud)

Cur*_*urt 15

实际上,您可以在GROUP BY或ORDER BY子句中包含CASE语句:

ORDER BY CASE
            WHEN reply IS NULL THEN 1  
            ELSE 0 
         END, category
Run Code Online (Sandbox Code Playgroud)


And*_*and 0

MySQL 会将所有 fr=null 的行分组为一组,就像它是一个普通值一样。

为了解决您的问题,我会对您的表进行子选择,其中新列要么获取 fr 的值(在它不为空的情况下),要么获取超出 fr 正常范围的增量值(可能是负数)。然后在新的虚拟列上执行外部选择分组。

set @i := 0;

select if(virtualFR<0,null,virtualFR) as fr, sum(fr_sum) from
(select *, if(fr is null,@i:=@i-1,fr) as virtualFR from myTable) virtual
group by virtualFR;
Run Code Online (Sandbox Code Playgroud)

sqlfiddle