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

时间:2011-11-28 05:49:45

标签: 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

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

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

4 个答案:

答案 0 :(得分: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 */

此表达式

name NOT IN ('homer','bart','marge','lisa','maggie') OR NULL

会导致1NULL,从而导致COUNT计算name的相应匹配项或忽略它。 (关于为什么OR NULL存在以及整个表达方式如何运作,我将向您推荐这个问题:Why do I need "OR NULL" in MySQL when counting rows with a condition。)

正如您所看到的,您也可以使用SUM执行相同操作,SUM的表达式显然更短,因为那里不需要OR NULL部分。当我需要计算事物时,我通常更喜欢COUNT()SUM(),而不是添加任意值。但是,据我所知,没有一个优先于另一个,所以使用哪个功能取决于你的个人喜好/品味。

答案 1 :(得分: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
)

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

答案 2 :(得分:1)

如果您的查询很大,我不认为这会非常有效,但对于较小的值,这应该可以解决问题:

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
)

我会尝试解释我的逻辑,以便其他人可以改进它:

我在LEFT JOIN中使用Pets AS p2来查看哪些动物具有限制值(将在p2中记录)

如果p2.Animal IS NULL,我们只关注允许名称的记录。然后,我检查COUNT()的{​​{1}}是否与该动物的animal表中的animals数相匹配(相关子查询)。

答案 3 :(得分:1)

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')
      )