【发布时间】:2015-11-18 20:20:58
【问题描述】:
假设我有这样一张桌子:
+----+----------+
|name|testValue |
+----+----------+
|A |3 |
+----+----------+
|A |4 |
+----+----------+
|A |7 |
+----+----------+
|B |0 |
+----+----------+
|B |3 |
+----+----------+
|C |5 |
+----+----------+
|C |5 |
+----+----------+
|C |6 |
+----+----------+
现在我首先想按名称对列进行分组,然后只能检索任何行满足特定条件的组。对于每个组,我想检索所有“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
但这仅检查组中第一行的“testValue”是否匹配。我在这个例子中的预期输出是:
+----+---------+----------+
|name|testValue|testValues|
+----+---------+----------+
|A |3 |3#4#7 |
+----+---------+----------+
|C |5 |5#5#6 |
+----+---------+----------+
虽然我的示例查询的实际输出是:
+----+---------+----------+
|name|testValue|testValues|
+----+---------+----------+
|C |5 |5#5#6 |
+----+---------+----------+
我的问题:
1.我怎样才能使它检查是否有任何行匹配,而不仅仅是第一行?我什至应该为此使用HAVING 吗?
- 还有比使用 GROUP_CONCAT 更好的方法从组中的行返回所有值吗?
顺便说一句,我试过用谷歌搜索,但发现它很困难。
【问题讨论】:
-
定义“第一”。您没有 PRIMARY KEY,这可能有问题
-
我检查了它,结果就是你想要的:sqlfiddle.com/#!9/816da/5