【问题标题】:Select total count of elements group by选择元素分组的总数
【发布时间】:2016-07-02 13:06:37
【问题描述】:

我有一个动物园。

动物园桌

id | name | 

动物桌

id | zoo_id | name |    type
1     1       Horse      0
2     1       Elephant   0   
3     1       Parrot     1
4     2       Whale      2     
5     2       Fox        0
6     1       Snake      3

我想选择所有动物园数据以及该动物园的动物总数该动物园中存在的所有动物类型

MySQL

SELECT zoo.id as zooid,zoo.name,
(SELECT COUNT(*) FROM animal WHERE animal.zoo_id = zoo.id) as total_animals
 FROM zoo;

但是我如何才能获得该动物园中存在的所有动物类型

预期结果

zooid | name |  total | available_types
 1      USAZOO   4        0 1 3    
 2      UKZOO    2        0 2     

由于我要选择很多 Zoo,因此 性能很重要

【问题讨论】:

  • 加入。使用 GROUP BY。
  • 请详细说明@jarlh
  • 第 1 步)与动物一起加入动物园。第 2 步)做一个 GROUP BY。
  • 你们 cmets 让我发笑:) 但我认为他需要 group_concat 所以这不是他要找的@jarlh
  • group_concat 包含在第 2 步中!

标签: mysql sql performance select group-by


【解决方案1】:

您可以使用 GROUP_CONCAT :

SELECT zoo.id as zooid,zoo.name,
       (SELECT COUNT(*) FROM animal WHERE animal.zoo_id = zoo.id) as total_animals,
       group_concat(type separator ' ')
FROM zoo
GROUP BY zoo.id,zoo.name

我想你也需要这个动物园名字,你是怎么得到你的名字结果的?无论如何-

SELECT zoo.id as zooid,
       group_concat(zoo.name separator ' ') as zoo_name,
       (SELECT COUNT(*) FROM animal WHERE animal.zoo_id = zoo.id) as total_animals,
       group_concat(type separator ' ')
FROM zoo
GROUP BY zoo.id

你应该用一个连接来做:

SELECT zoo.id as zooid,
       group_concat(zoo.name separator ' ') as zoo_name,
       COUNT(*) as total_animals,
       group_concat(type separator ' ')
FROM zoo
INNER JOIN animals
 ON animal.zoo_id = zoo.id
GROUP BY zoo.id

【讨论】:

  • 不能把子查询换成count(*)吗?
  • @jarlh 你的意思是添加加入然后计算全部,是的,我现在也添加了这个解决方案。
  • 那么哪一个是最好的?最后一个?
  • @JohnDoe 我相信是这样,但有些人更喜欢其他方法。
【解决方案2】:

细化sagi的答案:

SELECT Zoo.id as zooid, zoo.name AS name,
       COUNT(*) AS total,
       GROUP_CONCAT(DISTINCT type separator ' ') AS available_types
FROM Zoo
INNER JOIN Animal
 ON Animal.zoo_id = zoo.id
GROUP BY zoo.id

这只会为您提供不同类型的动物。你可以在这里玩一下:SQLFiddle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-01
    • 1970-01-01
    • 2020-12-11
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多