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

Mysql 选择所有元素都满足条件的分组,mysql,sql,group-by,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 我想挑选所有

我在使用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
我想挑选所有他的团队成员都有名字的动物(‘荷马’、‘巴特’、‘玛姬’、‘丽莎’、‘玛姬’)


如果你不明白我的问题,请告诉我谢谢

如果您的查询很大,我认为这不是很有效,但是对于较小的值,这应该可以做到:

SELECT p.animal
FROM pets AS p
LEFT JOIN pets AS p2 ON p.name = p2.name
   AND p2.Name NOT IN ('homer','bart','marge','lisa','maggie')
WHERE p2.id IS NULL
GROUP BY p.animal
HAVING COUNT(p.Animal) =
(
   SELECT COUNT(1)
   FROM pets AS p3
   WHERE p3.animal = p.animal
)
我将尝试解释我的逻辑,以便其他人能够改进它:

我正在使用
左键将
作为p2连接到
宠物中
,以查看哪些动物具有限制值(将在p2中有记录)


如果
p2.Animal为空
,我们将只对允许的名称进行记录。然后,我检查该
动物的
COUNT()
是否与该动物的
pets
表中的
动物的数量匹配(相关子查询)。

试一试。如果我找不到你要找的东西,请告诉我

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
)
当你这么说的时候,这听起来很明显,但要想只得到你想要的结果,有时需要先创建一个查询,获取所有你不想要的结果,然后将它们排除在外。

换句话说,就是“选择所有动物,它们的对应名称数量与条件不匹配。”(‘荷马’、‘巴特’、‘玛姬’、‘丽莎’、‘玛姬’)
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 */
这句话

name NOT IN ('homer','bart','marge','lisa','maggie') OR NULL
结果是
1
NULL
,从而导致
COUNT
计算
name
的相应出现次数或忽略它。(至于
或NULL
存在的原因以及整个表达式如何工作,我将向您提出以下问题:)


正如您所看到的,您也可以使用
SUM
来做同样的事情,
SUM
的表达式显然更短,因为那里不需要
或NULL
部分。我通常更喜欢
COUNT()
而不是
SUM()
当我需要计算事物时,而不是将任意值相加。但是,据我所知,两者之间没有优势,因此使用哪个函数取决于您的个人偏好/品味。

那么您想检索在
子句中的
中包含所有名称条目的动物吗?我相信OP不希望动物,如果它的名字在这些特定的名字之外,不一定是所有的名字。所以在上面的例子中,它应该只返回狗?@BrandonMoore是的,它应该只返回狗…你将如何确定这群人是狗???我的答案看起来像你想要的吗?@BrandonMoore是的,我们都得到了答案,但方式非常不同。在我非常小的测试表上,你的效率似乎提高了22%。(根据SQL Server)干得好。+1首先解决了这个词的问题。我不太明白他在找什么,直到我看了你的答案:)是的,比我的解决方案好,非常确定。没想到有动物不在
-很好+1@SashiKant对于此数据,我的也将只返回一行。我(我们)认为这是OPC的要求,要求是这样的::“我想挑选所有他的团队成员都有名字的动物(‘荷马’、‘巴特’、‘玛姬’、‘丽莎’、‘玛姬’)”看看这个短语——所有的animals@SashiKant也许我的英语没有帮助我表达我想要的。。。这个问题是在做我需要的工作!在这种情况下,是的,它将返回一行,因此,一般来说,我认为,如果在分组之前对结果进行筛选,即在WHERE子句中(使用相同的条件)。Nice和+1,则查询应该更有效。我想知道您是如何为Sql Server编写的,因为Sql Server中任何带null的按位操作都将导致null。我很想知道我的查询和你的查询在MySql中的性能差异,如果你碰巧有时间检查的话(我没有MySql或者我自己检查)。我也没有MySql,不能说性能,对不起。在SQL Server中,我通常使用
CASE
表达式进行条件计数,因此它可能是这样的:
具有计数(当名称不在('homer'、'bart'、'marge'、'lisa'、'maggie')中时,大小写为1 END)=0
。这里的
1
位可以替换为除
NULL
之外的几乎任何内容,因为
COUNT
只计算值,而不管满足条件时究竟是什么值。当不满足时,将计算隐含的
ELSE NULL
分支,因此
COUNT
在这种情况下不计算任何内容。顺便说一句,
CASE
方法也应该适用于MySQL。
SELECT DISTINCT animal
FROM pets p
WHERE NOT EXISTS
      ( SELECT *
        FROM pets pg
        WHERE pg.animal = p.animal
          AND pg.name NOT IN ('homer','bart','marge','lisa','maggie')
      )