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

标签 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) 当表中至少存在一行具有类似书写颜色(如“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/

相关文章:

php - 如何仅从表中获取已排序的更新行?

php - 如何在Mysql中更新和插入多行

php - 获取 ajax 的值并将其递增/连接到其他值 codeigniter

mysql - 在 j2ee Web 应用程序中查找函数

mysql - SQL 使用触发器填充新表

python - 处理 ElasticSearch 最 Pythonic 的方法是什么?

php - 我需要创建一个 php 表单来使用从之前的查询中获得的 ID 来更新数据库表

mysql - 在 Fortrabbit 上使用 Laravel 4.1(使用 Croppa)“图像上传”不写入 MySql 数据库或公共(public)文件夹

mysql - 是否可以执行 ORDER BY RAND() LIMIT 但包含 header ?

mysql - MYSQL 5 的奇怪行为(数据库隔离)