Mysql - 按 return 个零计数和分组

Mysql - Count and group by return zeros

我知道,这个问题被问了很多次,但我就是听不懂。

重要栏目:

保存的数据:
每个名字都被多次存储,即使是同一个类别,如:

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

在这种情况下>> 排除jeff并输出所有其他。

目标:
Select 在此时间跨度内任何地方没有特定类别(此处称为 "exCat")的两个日期之间的所有名称。

听起来很简单是不是?嗯,反正拿不到。第一部分很简单:
SELECT name FROM myTable WHERE date >= @start AND date <= @end(也可以使用 BETWEEN)。

然后我需要类似 WHERE category NOT LIKE "exCat" 的东西。
这行不通。此查询将输出除 "exCat" 之外至少有一个其他类别的每个人。但在这个特定的时间跨度内,我什至不需要这些人一次包含 "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

所以这就像 SELECT name WHERE name NOT IN (SELECT name WHO GOT AT LEAST 1 "exCat") 像这样,我只会排除至少有一个 "exCat" 的人,例如我会得到一个结果,人们在任何地方都没有 "exCat"。

问题所在:每个子查询大约需要0.05秒,这样加起来大约需要15分钟。太过分了

您可以使用条件聚合:

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

这是一种在不使用子查询的情况下仅排除 至少一个 exCat 的人的方法。

Demo here

试试这个

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