带计数的子查询(mysql)

带计数的子查询(mysql),mysql,sql,subquery,Mysql,Sql,Subquery,我有下表: id | user | createdAt | pstatus ------------------------------------------------------- 287 | Foo | 2013-08-01 17:19:24 | PLAYING 286 | Foo | 2013-08-01 17:18:24 | IDLE 285 | Foo | 2013-08-01 17:17:24 | PLAYING 284 |

我有下表:

id   | user | createdAt           | pstatus  
-------------------------------------------------------
287  | Foo  | 2013-08-01 17:19:24 | PLAYING  
286  | Foo  | 2013-08-01 17:18:24 | IDLE  
285  | Foo  | 2013-08-01 17:17:24 | PLAYING  
284  | Foo  | 2013-08-01 17:16:24 | BUFFERING 
283  | Foo  | 2013-08-01 17:15:24 | STOPPED
如何查询此表以生成以下结果?基本上,我需要获得每个用户每天不同pstatus值的总数

User | logdate    | playCount | idleCount | bufferCount | StopCount
-------------------------------------------------------------------
Foo  | 2013-08-01 |         48|        62 |           0 |         4
Foo  | 2013-08-02 |         25|        22 |           0 |         0
Bar  | 2013-08-02 |         22|        32 |           5 |         4
Bar  | 2013-08-03 |         44|        11 |           1 |         0
Foo  | 2013-08-03 |         32|        03 |           0 |         0
我知道我可以使用DATE(createdAt)来获取每天的日期,而不是时间戳,但我很难将以下内容合并到一个查询中:

COUNT(pstatus) AS playCount WHERE pstatus = "PLAYING";
COUNT(pstatus) AS idleCount WHERE pstatus = "IDLE";
COUNT(pstatus) AS bufferCount WHERE pstatus = "BUFFERING";
COUNT(pstatus) AS StopCount WHERE pstatus = "STOPPED";

我很确定它需要是子查询,但是语法很难理解

您可以使用带有条件的
求和
,这将产生一个布尔值,并根据条件给出计数

SELECT
DATE(createdAt) logdate,    
SUM(pstatus = "PLAYING") playCount 
,SUM(pstatus = "IDLE") idleCount 
,SUM(pstatus = "BUFFERING") bufferCount 
,SUM(pstatus = "STOPPED") StopCount
FROM `table`
GROUP BY `User`,DATE(`createdAt`)
试试这个:

   SELECT 
  SUM(CASE 
         WHEN pstatus = "PLAYING" THEN 1
         ELSE 0
       END) AS sumPLAYING,
   SUM(CASE 
         WHEN pstatus = "IDLE" THEN 1
         ELSE 0
       END) AS sumIDLE,

   SUM(CASE 
         WHEN pstatus = "BUFFERING" THEN 1
         ELSE 0
       END) AS sumBUFFERING,
   SUM(CASE 
         WHEN pstatus = "STOPPED" THEN 1
         ELSE 0
       END) AS sumSTOPPED
FROM YOUR_TABLE 

pstatus在第二台table@JustinMitchell我看不到OP的问题完美的第二张表——这正是我想要的。供参考的最终查询如下所示:按用户选择用户,日期(createdAt)作为createdAtDate,SUM(pstatus=“PLAYING”)作为playCount,SUM(pstatus=“IDLE”)作为idleCount,SUM(pstatus=“BUFFERING”)作为bufferCount,SUM(pstatus=“STOPPED”)作为pings组中的StopCount,按用户ASC选择日期(createdAt)顺序,CreatedAtDate ASC