为了简单起见,我们假设我有一个包含以下数据的表格:
Color Temp Value
----- ---- -----
red hot 1
red cold 1
red mild 2
red hot 2
red cold 3
blue hot 1
blue cold 2
blue hot 2
blue mild 3
blue hot 3
blue cold 2
green hot 1
yellow hot 1
yellow mild 1
yellow cold 4
yellow hot 3
reddish hot 1
reddish mild 3
reddish cold 4
purple hot 1
purple mild 3
purple cold 2
我想查询表格分组并计算每种颜色的出现次数并排除此内容
1) 排除出现次数少于 2 次的组,因此我想排除“绿色”组
2) 排除其中至少有一行的“值”列中包含“4”的组。因此排除“黄色”和“微红”组
3) 当表中至少存在一行具有类似书写颜色(如“color%”?)且“值”列中包含“4”时,排除组。因此我想排除“红色”组,因为有一行颜色为“红色”且值为“4”
因此,在我输入的示例数据中,我希望查询仅返回:
Color Count(*)
----- --------
blue 6
purple 3
我怀疑这个查询应该使用 JOIN 子句的某种组合,使用变量和/或子查询,也许还有 LIKE CONCAT,但所有这些对我来说都是新的,所以我似乎无法达到有效的查询。或者也许比这简单得多。
有人知道如何编写这个查询吗? 非常感谢。
最佳答案
您可以使用HAVING
子句来设置聚合条件。对于前两个条件,查询将如下所示:
SELECT color, COUNT(*) AS colorCount
FROM myTable
GROUP BY color
HAVING COUNT(*) >= 2 AND SUM(val = 4) = 0;
此查询将仅返回至少有 2 行且没有值 = 4 的行的组的计数。最后一个条件有点棘手,我认为您无法使用 解决此问题HAVING
子句。
我要做的就是首先将其视为一个单独的问题,然后再解决。要获取 val = 4 的所有行,请尝试以下操作:
SELECT DISTINCT color
FROM myTable
WHERE val = 4;
一旦你有了它,你就可以将它加入到它的相关颜色中,如下所示:
SELECT DISTINCT m.color
FROM myTable m
JOIN(
SELECT DISTINCT color
FROM myTable
WHERE val = 4) tmp ON tmp.color LIKE CONCAT(m.color, '%');
在您的示例中,上述查询将返回“red”。因此,要从最终结果中排除红色,您可以使用 NOT IN
运算符。我在第一个结果集上使用了该运算符,以便仅在生成的聚合行上检查条件:
SELECT color, colorCount
FROM(
SELECT color, COUNT(*) AS colorCount
FROM myTable
GROUP BY color
HAVING COUNT(*) >= 2 AND SUM(val = 4) = 0) tmp
WHERE color NOT IN(
SELECT DISTINCT m.color
FROM myTable m
JOIN(
SELECT DISTINCT color
FROM myTable
WHERE val = 4) tmp ON tmp.color LIKE CONCAT(m.color, '%'));
这是一个SQL Fiddle使用您的示例数据作为示例。
关于mysql - GROUP BY 如何过滤掉同一个表的另一行中具有类似写入值的组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31858329/