Mysql 选择所有元素都满足条件的分组
我在使用MySQL查询时遇到了一些问题 我想从一个表中选择所有元素,从某个列进行分组,但只检索那些组中所有元素都与where子句匹配的元素 例如,我有一个名为“pets”的表,有3列: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 我想挑选所有
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')
)