我知道,这个问题已经多了几次,但我无法得到它。
重要栏目:
保存的数据:
即使使用相同的类别,每个名称也会多次存储:
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分钟。太多了。
答案 0 :(得分:1)
您可以使用条件聚合:
SELECT name
FROM mytable
GROUP BY name
HAVING COUNT(CASE WHEN category = 'exCat' THEN 1 END) = 0
这种方法只排除至少一个 exCat
但未使用子查询的人。
答案 1 :(得分:0)
试试这个
SELECT name
FROM mytable
GROUP BY name
HAVING NOT FIND_IN_SET('exCat', GROUP_CONCAT(category))