Ist*_*min 2 mysql sql group-by
假设我有一个这样的表:
+----+----------+
|name|testValue |
+----+----------+
|A |3 |
+----+----------+
|A |4 |
+----+----------+
|A |7 |
+----+----------+
|B |0 |
+----+----------+
|B |3 |
+----+----------+
|C |5 |
+----+----------+
|C |5 |
+----+----------+
|C |6 |
+----+----------+
Run Code Online (Sandbox Code Playgroud)
现在我首先要按名称对列进行分组,然后只能检索任何行满足特定条件的组.对于每个组,我想要检索所有"testValues",我目前正在使用GROUP_CONCAT.
例如,如果我想要检索任何"testValues"在4到8之间的所有组:
SELECT
name,
testValue,
GROUP_CONCAT(testValue SEPARATOR '#') AS testValues
FROM myTable
GROUP BY name
HAVING testValue > 4 AND testValue < 8
Run Code Online (Sandbox Code Playgroud)
但这只会检查组中第一行的"testValue"是否匹配.我在这个例子中的预期输出是:
+----+---------+----------+
|name|testValue|testValues|
+----+---------+----------+
|A |3 |3#4#7 |
+----+---------+----------+
|C |5 |5#5#6 |
+----+---------+----------+
Run Code Online (Sandbox Code Playgroud)
虽然我的示例查询的实际输出是:
+----+---------+----------+
|name|testValue|testValues|
+----+---------+----------+
|C |5 |5#5#6 |
+----+---------+----------+
Run Code Online (Sandbox Code Playgroud)
我的问题:1.我怎样才能检查是否有任何行匹配,而不仅仅是第一行?我甚至应该用HAVING它吗?
顺便说一句,我试过谷歌这个,但发现它很难.
您可以使用:
SELECT name, MIN(testValue) AS testValue,
GROUP_CONCAT(testValue SEPARATOR '#') AS testValues
FROM mytable
GROUP BY name
HAVING COUNT(CASE WHEN testValue BETWEEN 4 AND 8 THEN 1 END) > 0
Run Code Online (Sandbox Code Playgroud)
HAVING子句使用条件聚合来计算testValue[4-8]范围内的值的数量.这将单独应用于每个name组.
查询仅HAVING返回满足谓词的组.因此,仅返回具有[4-8]范围内的至少一行的组testValue.
注意:不清楚要返回哪个值testValue.在OP中提供的样本结果集中,选择最小值.如果您希望实际值在[4-8]范围内,则可以使用:
GROUP_CONCAT(CASE
WHEN testValue BETWEEN 4 AND 8
THEN testValue
END SEPARATOR '#') AS testValue
Run Code Online (Sandbox Code Playgroud)
在SELECT您的查询的子句中.
| 归档时间: |
|
| 查看次数: |
1302 次 |
| 最近记录: |