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
的人的方法。
试试这个
SELECT name
FROM mytable
GROUP BY name
HAVING NOT FIND_IN_SET('exCat', GROUP_CONCAT(category))
我知道,这个问题被问了很多次,但我就是听不懂。
重要栏目:
- 姓名
- 日期
- 类别
保存的数据:
每个名字都被多次存储,即使是同一个类别,如:
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
的人的方法。
试试这个
SELECT name
FROM mytable
GROUP BY name
HAVING NOT FIND_IN_SET('exCat', GROUP_CONCAT(category))