Mysql 在一定条件下分组

Mysql 在一定条件下分组,mysql,group-by,case,Mysql,Group By,Case,我在查询的分组部分遇到了一些MySQL问题。 我想在GROUPBY中使用一列,但该列只应用于依赖于行中某个值的特定条件。假设我有这张桌子: 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 | +---

我在查询的分组部分遇到了一些MySQL问题。 我想在GROUPBY中使用一列,但该列只应用于依赖于行中某个值的特定条件。假设我有这张桌子:

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)

现在我想检索所有的行,当b==1时,它应该只使用c列上的GROUPBY。这意味着我希望返回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子句,其中b列和c列用逗号分隔:

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


请参阅中的结果。

根据所需的输出,您可能需要在这些行上执行某些操作

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

预期的结果是什么?这意味着我希望返回5行,因为第2行和第3行应该分组。所以带| 3 | 1 | 2 |的那一行应该是“缺失”的当然,我看到了。但这并不意味着什么。你希望从这个群体中获得什么价值?GROUPBY的目的不是忽略行,而是计算行组的聚合值。如果要忽略a==3的行,可以使用DISTINCT。当有两行或更多行的b==1且列c上的值相同时,选择标准是什么?此查询也可以忽略行| 2 | 1 | 2 |,并返回| 3 | 1 | 2 |。在这种情况下,选择既不包含在GROUP BY中也不在功能上依赖于所包含列的列a在标准SQL中是一个错误。MySQL接受它,但结果是未定义的行为。它在文档中:服务器可以从每个组中自由选择任何值,因此,除非它们相同,否则选择的值是不确定的,这不会起作用。如果有另一行b=2和c=2,则该行将与a=4的行分组。我更新了我的问题/示例表。当然,在我的例子中,这涉及到不同表上的多个连接,这将使真正的查询更加困难。但我想了解一下它是如何工作的。MySQL上关于CASE和GroupBy的解释对我来说是不够的。@LaVomit:更新了我的答案。现在就试试吧,谢谢你。虽然在我的案例中,a列上的GROUP BY依赖于另一个案例,但我认为这是最好的方法。我现在按照我想要的方式工作,这确实给了我预期的结果。虽然我想寻找一种替代使用UNION的方法。由于这涉及到非常大的表,因此需要一段时间才能执行。一个联合会使查询的长度大约是所有连接的两倍。你在聚合哪些列?我刚才使用了一个c分组和行数。作为一个例子。你能把你需要的输出贴出来吗?
SELECT c, count(*) FROM test_table where b=1 GROUP BY c
UNION 
SELECT c, count(*) FROM test_table where b<>1