GROUP BY如何在同一个表的另一行中过滤掉具有类似写入值的组?

时间:2015-08-06 14:23:43

标签: mysql

为简单起见,我有一个包含这些数据的表格:

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)当表格中至少有一行存在类似书写的颜色(LIKE' color%'?)时,排除组,其中" 4"在"值"柱。因此我想排除" red"组,因为有一排颜色" reddish"和价值" 4"

所以在我放的示例数据中,我希望我的查询只返回:

Color    Count(*)
-----    --------
blue        6
purple      3

我怀疑这个查询应该使用JOIN子句的混合,使用变量和/或子查询可能LIKE CONCAT,但所有这些对我来说都是新的,所以我似乎无法到达一个有效的查询。或者它可能比这简单得多。

有人知道怎么写这个查询吗? 非常感谢。

1 个答案:

答案 0 :(得分:1)

您可以使用HAVING子句设置聚合条件。对于前两个条件,查询将如下所示:

SELECT color, COUNT(*) AS colorCount
FROM myTable
GROUP BY color
HAVING COUNT(*) >= 2 AND SUM(val = 4) = 0;

此查询仅返回至少有2行的组的计数,并且没有值= 4的行。最后一个条件有点棘手,我认为你不能使用{{1 }。clause。

我要做的是首先将此视为一个单独的问题,然后再进行处理。要获取val = 4的所有行,请尝试以下操作:

HAVING

一旦你拥有了它,你可以加入它的相关颜色,如下所示:

SELECT DISTINCT color
FROM myTable
WHERE val = 4;

在您的示例中,上面的查询将返回“red”。因此,要从最终结果中排除红色,您可以使用SELECT DISTINCT m.color FROM myTable m JOIN( SELECT DISTINCT color FROM myTable WHERE val = 4) tmp ON tmp.color LIKE CONCAT(m.color, '%'); 运算符。我在第一个结果集上使用了该运算符,以便仅在生成的聚合行上检查条件:

NOT IN

以下是您的示例数据的SQL Fiddle示例。