MySQL:如果任何行匹配,请选择组

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它吗?

  1. 还有什么比使用GROUP_CONCAT更好的方法从组中的行返回所有值?

顺便说一句,我试过谷歌这个,但发现它很难.

Gio*_*sos 5

您可以使用:

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您的查询的子句中.