Mysql - 按返回零计数和分组

时间:2015-07-31 14:15:13

标签: mysql join count subquery

我知道,这个问题已经多了几次,但我无法得到它。

重要栏目:

  • 名称
  • 日期
  • 类别

保存的数据:
即使使用相同的类别,每个名称也会多次存储:

s.lower() is 'hello'

在这种情况下>> 排除杰夫并输出所有其他内容。

目标:
在此时间段内的任何位置选择两个日期之间没有特定类别(此处称为“exCat”)的所有名称。

听起来很简单吗?好吧,无论如何都无法得到它。第一部分很简单:
name | category | date -----|----------|------- jeff | exCat | 2015-07-02 paul | red | 2015-07-04 jeff | red | 2015-07-03 paul | blue | ... kevin| green | ... jeff | green | ... mike | red (也可以使用SELECT name FROM myTable WHERE date >= @start AND date <= @end)。

然后我需要像BETWEEN这样的东西 这不行。此查询将输出我在“exCat”旁边至少有一个其他类别的所有人。但是我需要那些在这个特定的时间段内甚至没有一次包含“exCat”的家伙。

一件可能的事情:

WHERE category NOT LIKE "exCat"

所以这就像SELECT name AS Name FROM myTable WHERE date >= @start AND date <= @end AND Name NOT IN (SELECT name FROM myTable WHERE date >= @start AND date <= @end AND category LIKE "exCat") GROUP BY name 像这样我只会排除至少有一个“exCat”的人,例如对于没有“exCat”的人来说,我会得到一个结果。

问题:每个子查询需要大约0.05秒,这两者一起大约需要15分钟。太多了。

2 个答案:

答案 0 :(得分:1)

您可以使用条件聚合

SELECT name
FROM mytable
GROUP BY name
HAVING COUNT(CASE WHEN category = 'exCat' THEN 1 END) = 0

这种方法只排除至少一个 exCat但未使用子查询的人。

Demo here

答案 1 :(得分:0)

试试这个

SELECT name
 FROM mytable
 GROUP BY name
 HAVING NOT FIND_IN_SET('exCat', GROUP_CONCAT(category))