9

有没有办法在 group by 子句中使用 if?

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

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

编辑:对不起,我想我应该举一个更具体的例子

下面的列包含类别、线程和回复的 id

这是一个论坛

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

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

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

我没有将回复的值设置为空,它们是这样的,因为加入的结果

| 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    |

那么结果将是

| category | thread | reply |
-----------------------------
| 1        | 3      | 3     |
| 2        | 1      | 1     |
| 3        | 2      | 2     |
| 4        | 1      | null  |
| 5        | 1      | null  |
4

6 回答 6

15

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

ORDER BY CASE
            WHEN reply IS NULL THEN 1  
            ELSE 0 
         END, category
于 2013-07-10T07:11:02.263 回答
4

从 mysql 5.6 开始,您可以在 order by 子句中使用 IF()。

像这样:

ORDER BY IF(reply=NULL, 1, 0), category

对于您的具体情况,可能不是正确的答案,但对于其他搜索类似内容的人来说很方便。

于 2014-07-21T14:21:45.300 回答
1

如果我理解正确,请尝试以下方式:

(
SELECT category, COUNT(thread) AS thread, COUNT(reply) AS reply
  FROM test
  WHERE reply IS NOT NULL
  GROUP BY category
)
UNION ALL
(
SELECT category, COUNT(thread) AS thread, reply
  FROM test
  WHERE reply IS NULL
  GROUP BY category
)
ORDER BY category

SQL小提琴

于 2013-07-10T06:32:47.363 回答
0

尝试使用分组依据

select 
min(id), 
sum(fr_sum), 
fr
from Table1
group by fr

SQL小提琴

于 2013-07-10T06:19:26.063 回答
0

You can simply do this:

select min(id) id, sum(fr_sum) fr_sum, fr
from mytable
group by 3
于 2013-07-10T06:16:41.947 回答
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;

sqlfiddle

于 2013-07-10T06:15:09.107 回答