Php 按单行中的名称对列组的值进行计数

Php 按单行中的名称对列组的值进行计数,php,mysql,sql,group-by,Php,Mysql,Sql,Group By,我想数一数每个人有多少只动物,以及每只动物的个体。我有一个这样列的表 | name | animals | ------------------------- | abc | 'dog' | | def | 'dog' | | def | 'cat' | | abc | 'dog' | | def | 'cat' | | def | 'mouse' | | abc

我想数一数每个人有多少只动物,以及每只动物的个体。我有一个这样列的表

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

有人能告诉我如何查询吗?

你可以试试类似的方法

SELECT name, animals, COUNT(1)
FROM table
GROUP BY name, animals
通过这种方式,您将以与您要求的格式不同的格式获得结果,但数据在那里。。。要计算总数,您可以使用php编辑 -如评论中所述,这种方式不起作用。更简单的方法是使用SQL过程或过程语言(如PHP)来实现这一点

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

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

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

数据显示问题通常最好在应用程序级/表示层代码中处理。或者,这是一个简单的PIVOT查询。那么,查询结果是什么呢?这里有一个解决方案吗?我已经为您的问题发布了一个解决方案,您可以测试itI我认为这不会运行查询,因为子查询无法获取父查询的别名,因为子查询首先运行,并且当子查询尚未完成其结果时,父查询不会执行,如果未执行父查询,则无法告知父查询的别名从您的查询中执行子查询查询不知道t.name,因为它属于父级,并且父级尚未执行,所以t.name未知
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