【问题标题】:count values of a column group by name in a single row在单行中按名称计算列组的值
【发布时间】:2014-01-30 11:59:34
【问题描述】:

我想计算某个人有多少只动物,并计算每只动物的个体。我有一个包含这些列的表

|   name   |   animals  |
-------------------------
|   abc    |    'dog'   |
|   def    |    'dog'   |
|   def    |    'cat'   |
|   abc    |    'dog'   |
|   def    |    'cat'   |
|   def    |    'mouse' |
|   abc    |    'cat'   |
|   def    |    'dog'   |

我的结果应该是这样的

|   name   |  dog    |   cat   |   mouse   |   Total   |
--------------------------------------------------------
|   abc    |   2     |    1    |     0     |     3     |
|   def    |   2     |    2    |     1     |     5     |

请谁能告诉我如何查询?

【问题讨论】:

  • 数据显示问题一般最好在应用层/表现层代码中处理。或者,这是一个简单的 PIVOT QUERY。
  • 那么可以查询什么
  • 没有解决办法吗?
  • 我已经发布了解决您问题的方法,您可以测试一下

标签: php mysql sql group-by


【解决方案1】:
SELECT *,
       (dogs + cats + mouses) as total
FROM(
  SELECT
    tdogs.name,
IFNULL(ndogs,0) as dogs,
IFNULL(ncats,0) as cats,
IFNULL(nmouses,0) as mouses    

FROM (SELECT name, count(*) ndogs FROM mytable where animals='dog' GROUP BY name) tdogs
LEFT JOIN 
(SELECT name, count(*) ncats FROM mytable where animals='cat' GROUP BY name) tcats
ON tdogs.name = tcats.name 
LEFT JOIN
(SELECT name, count(*) nmouses FROM mytable where animals='mouse' GROUP BY name ) tmouses
ON tmouses.name=tcats.name

GROUP BY tdogs.name) x

我有一个错误,因为当我数鼠标时得到NULL,但我已经修复,这就像你想要的那样工作。

你可以试试 SQLFiddle here

【讨论】:

    【解决方案2】:

    你可以试试

    SELECT name, animals, COUNT(1)
    FROM table
    GROUP BY name, animals
    

    通过这种方式,您将获得与您要求的格式不同的结果,但数据在那里...计算总数,然后您可以使用 php

    【讨论】:

      【解决方案3】:

      编辑 - 如 cmets 中所述,这种方式行不通。更简单的方法是使用 SQL 过程或过程语言(例如 PHP)来完成。

      您可以创建一些子查询来处理这个问题,但我认为您不能完全动态地管理它。我假设您的表名为“my_table”。

      SELECT
          t.name,
          (SELECT COUNT(*) FROM my_table t2 WHERE t2.name = t.name AND t2.animals = 'dog' ) AS 'dog',
          (SELECT COUNT(*) FROM my_table t3 WHERE t3.name = t.name AND t3.animals = 'cat' ) AS 'cat',
          (SELECT COUNT(*) FROM my_table t4 WHERE t4.name = t.name AND t4.animals = 'mouse' ) AS 'mouse'
      
      FROM
          my_table t
      
      GROUP BY t.name;
      

      我没有测试这个查询,这是为了说明这个想法。

      【讨论】:

      • 我不认为这会运行查询,因为子查询无法获取父查询的别名,因为子查询首先运行,而子查询尚未完成其结果父查询不执行,如果父查询是未执行则不能将父别名告诉子查询
      • 从您的查询中它会卡住说子查询不知道 t.name 因为它属于父级并且父级尚未执行所以 t.name 未知
      猜你喜欢
      • 1970-01-01
      • 2018-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-28
      • 1970-01-01
      • 2012-09-05
      相关资源
      最近更新 更多