GROUP BY 在一定条件下

GROUP BY on certain condition

我在查询的 GROUP BY 部分遇到了一些 MySQL 困难。 我想在 GROUP BY 中使用一列,但它应该只用于取决于行中某个值的特定条件。假设我有这个 table:

mysql> SELECT * FROM test_table;
+---+---+---+
| a | b | c |
+---+---+---+
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 1 | 2 |
| 4 | 2 | 2 |
| 5 | 2 | 3 |
| 6 | 3 | 1 |
| 7 | 2 | 2 |
+---+---+---+
7 rows in set (0.00 sec)

现在我想检索所有行,它应该只在 c 列上使用 GROUP BY,当 b === 1 时。这意味着我想取回 6 行,因为行数字 2 和 3 应该分组。所以我想出了以下查询,它没有给我预期的结果。

mysql> SELECT * FROM test_table GROUP BY CASE WHEN b = 1 THEN c END;
+---+---+---+
| a | b | c |
+---+---+---+
| 4 | 2 | 2 |
| 1 | 1 | 1 |
| 2 | 1 | 2 |
+---+---+---+
3 rows in set (0.00 sec)

我可能在 CASE 语句和 GROUP BY 的组合中遗漏了一些东西,我希望你们中的任何人能帮助我。

您可以使用一个简单的 GROUP BY 子句,其中列 bc 以逗号分隔:

SELECT * 
FROM test_table 
GROUP BY CASE WHEN b=1 THEN c ELSE a END;

结果:

A   B   C
1   1   1
2   1   2
4   2   2
5   2   3
6   3   1
7   2   2

SQL Fiddle 中查看结果。

根据您所需的输出,您可能需要在这些行上做一些事情

SELECT c, count(*) FROM test_table where b=1 GROUP BY c
UNION 
SELECT c, count(*) FROM test_table where b<>1