0

这是问题表

+---------+----------+------+
| owner   | species  | sex  |
+---------+----------+------+
| Harry   | cat      | f    |
| Gwen    | dog      | m    |
| Adlai   | rat      | m    |
| Alex    | bird     | f    |
| Harry   | dog      | f    |
| Gwen    | cat      | m    |
| Gwen    | dog      | f    |
+---------+----------+------+

我试过了>

SELECT owner,MAX(count(species)) FROM pet GROUP BY owner;

没收到。

我设法得到>

SELECT owner, count(species)  FROM pets GROUP BY owner;
+---------+----------------+
| owner   | count(species) |
+---------+----------------+
| Gwen    |              3 |
| Adlai   |              1 |
| Harry   |              2 |
| Alex    |              1 |
+---------+----------------+

但它只需要一个......请帮忙!

谢谢!

4

2 回答 2

0

与其对特定物种进行硬编码,不如说您要的是……在宠物的主人中,我想知道谁拥有最独特的物种,无论性别如何(男/女)。无论数量是多少,您都想列出拥有该物种数量的所有所有者。首先从获得每个所有者、任何物种的最高不同物种数量开始......

但是,通过重新阅读,您似乎将 Gwen 视为 3 个物种,尽管 2 个是狗,1 个是猫,但狗是一只雄性,一只雌性......如果某人有 4 只狗,它们都是雄性和 5 只猫都是雌性。那算不算2种?

无论如何,根据我基于不同物种(不分性别)的原件,我有一个解决方案

select
      PreQuery.owner,
      PreQuery.SpeciesCount,
      @HighCount := if( @HighCount < PreQuery.SpeciesCount, 
           PreQuery.SpeciesCount, @HighCount ) as KeepCount
   from
      ( select 
              owner, 
              count( distinct species ) as SpeciesCount
           from 
              pets
           group by 
              owner
           order by 
              count( distinct species ) desc ) PreQuery,
      ( select @HighCount := 0 ) sqlvars
   having
      SpeciesCount = KeepCount

SQL 小提琴

第一个查询预先聚合了 DISTINCT 物种的数量,不考虑性别和顺序,最高计数首先出现。通过使用 MySQL 变量(通过@varName),我将结果集中返回的第一条记录应用到高计数值,然后将其保留在所有后续记录中。

最后,“HAVING”子句允许它只保留那些拥有最大数量的人。在这种情况下,它有两个人,两个人有两个不同的物种。

如果您确实想要基于物种和性别,我们可以修改查询,但原理是相同的。

另一个基于不同物种和性别的查询

我刚改成

count( distinct concat(species, sex) )

在这两个地方

于 2013-05-16T02:51:52.103 回答
0

1.

  SELECT owner
    FROM pet
   WHERE species IN ('cat', 'dog')
GROUP BY owner
  HAVING COUNT(*) = 2

此查询假定所有者只能拥有一只猫和一只狗。

1a。

    SELECT p1.owner
      FROM pet p1
INNER JOIN p2 ON p1.owner = p2.owner
             AND p2.pet = 'dog'
     WHERE p1.pet = 'cat'
  GROUP BY p1.owner

这个查询稍微好一点,因为它不关心每个主人有多少只宠物。

2.

  SELECT owner, count(species) cnt
    FROM pets
GROUP BY owner
ORDER BY count(species) DESC
   LIMIT 1

PS:下次尝试自己做作业;-)

于 2013-05-16T01:31:48.453 回答