2014-04-13 6 views
1

У меня есть следующая таблица:подзапросов с COUNT (MySQL)

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

Я уверен, что это должен быть подзапрос, но он борется с синтаксисом!

ответ

3

Вы можете использовать SUM с условием это приведет к булево и даст вам счет на основе условий

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

Demo

+0

pstatus находится на вторая таблица –

+0

@JustinMitchell я не вижу вторую таблицу в вопросе OP –

+1

Perfect - это было именно то, что я искал. FYI окончательный запрос выглядит 'ВЫБРАТЬ пользователя, ДАТА (createdAt) AS createdAtDate, SUM (pstatus = "ИГРАТЬ") AS прослушиваний , SUM (pstatus = "IDLE") AS idleCount , SUM (pstatus =" BUFFERING ") AS bufferCount , SUM (pstatus =" STOPPED ") AS StopCount FROM pings GROUP BY Пользователь, DAY (createdAt) ORDER BY Пользователь ASC, CreatedAtDate ASC' – Neokoenig

0

попробовать это:

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 
Смежные вопросы