选择所有元素满足条件的分组

Naz*_*nzo 11 mysql sql group-by

我在使用MySQL查询时遇到了一些麻烦.

我想从表中选择所有元素,从某个列进行分组,但只检索组中所有元素与WHERE子句匹配的元素.

例如,我有一个名为"pets"的表,有3列:

Id| animal | name
1 | dog    | marge
2 | dog    | homer
3 | cat    | marge
4 | cat    | lenny
5 | rabbit | homer
5 | rabbit | carl
6 | rabbit | marge
Run Code Online (Sandbox Code Playgroud)

而且我想挑选他所有小组成员都有名字的所有动物('本垒打','巴特','marge','lisa','maggie')

如果你无法理解我的问题,请告诉我.谢谢!

And*_*y M 6

换句话说,它是"选择所有的动物对他们来说,相应的名称不匹配条件的数量IN ('homer','bart','marge','lisa','maggie')0".

所以它也可以像这样实现:

SELECT animal
FROM pets
GROUP BY animal
HAVING COUNT(name NOT IN ('homer','bart','marge','lisa','maggie') OR NULL) = 0
  /* or: SUM(name NOT IN ('homer','bart','marge','lisa','maggie')) = 0 */
Run Code Online (Sandbox Code Playgroud)

这个表达

name NOT IN ('homer','bart','marge','lisa','maggie') OR NULL
Run Code Online (Sandbox Code Playgroud)

结果在任一1NULL,因此引起COUNT任一计数的对应的发生name或忽略它.(至于为什么OR NULL以及整个表达式如何工作,我将引用你们这个问题:为什么在计算具有条件的行时我在MySQL中需要"OR NULL".)

正如您所看到的,您也可以使用SUM相同的方法,而表达式SUM显然更短,因为OR NULL那里不需要该部分.我平时喜欢COUNT()SUM()时候我需要的东西,而不是添加了任意值.但是,据我所知,没有一个优先于另一个,所以使用哪个功能取决于您的个人喜好/品味.


Bra*_*ore 5

试一试.如果我错过了你正在寻找什么的标记,请告诉我.

select animal
from pets
group by animal
having animal not in
(
select animal
from pets
where name not in ('homer','bart','marge','lisa','maggie')
group by animal
)
Run Code Online (Sandbox Code Playgroud)

当你这么说时听起来很明显,但是获得你想要的结果的诀窍有时候是首先创建一个查询来获取你不想要的所有结果然后只是排除它们.