扩展复杂SQL语句的GROUPing

时间:2016-02-25 18:42:12

标签: mysql sql

我目前有一个查询,可以在4个不同的时间序列中抓取关键字出现次数(在本例中为4个不同的星期)。

SELECT CASE 
        WHEN request_unixtime > 1453907061 AND request_unixtime < 1454511861 THEN 'cnt3' 
        WHEN request_unixtime > 1454511861 AND request_unixtime < 1455116661 THEN 'cnt2' 
        WHEN request_unixtime > 1455116661 AND request_unixtime < 1455721461 THEN 'cnt1' 
        WHEN request_unixtime > 1455721461 AND request_unixtime < 1456412661 THEN 'cnt' 
    END, 
    count(*) FROM keywords 
WHERE 
    keyword = 'football' 
    AND request_unixtime > 1453907061 AND request_unixtime < 1456412661 

GROUP BY CASE 
    WHEN request_unixtime > 1453907061 AND request_unixtime < 1454511861 THEN 'cnt3' 
    WHEN request_unixtime > 1454511861 AND request_unixtime < 1455116661 THEN 'cnt2' 
    WHEN request_unixtime > 1455116661 AND request_unixtime < 1455721461 THEN 'cnt2' 
    WHEN request_unixtime > 1455721461 AND request_unixtime < 1456412661 THEN 'cnt' 

END;

谁的结果看起来像这样...

=============
| cnt  | 35 |
| cnt2 | 30 |
| cnt3 | 27 |
| cnt4 | 41 |

但是,我希望能够同时为多个关键字执行此操作。而不是

WHERE keyword='football'

我想

WHERE keyword IN ('football','soccer','tennis)

但我不知道如何重新制定CASE和GROUP BY,最终得出一个可以通过关键字打破计数的结果。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

只需将关键字添加到SELECT列表和GROUP BY即可:

SELECT
    K.keyword,
    CASE
        WHEN K.request_unixtime > 1453907061 AND K.request_unixtime < 1454511861 THEN 'cnt3' 
        WHEN K.request_unixtime > 1454511861 AND K.request_unixtime < 1455116661 THEN 'cnt2' 
        WHEN K.request_unixtime > 1455116661 AND K.request_unixtime < 1455721461 THEN 'cnt1' 
        WHEN K.request_unixtime > 1455721461 AND K.request_unixtime < 1456412661 THEN 'cnt' 
    END AS time_series,
    count(*) AS cnt
FROM
    Keywords K
WHERE
    K.request_unixtime > 1453907061 AND
    K.request_unixtime < 1456412661 AND
    K.keyword IN ('football', 'tennis', 'soccer')
GROUP BY
    K.keyword,
    CASE
        WHEN K.request_unixtime > 1453907061 AND K.request_unixtime < 1454511861 THEN 'cnt3' 
        WHEN K.request_unixtime > 1454511861 AND K.request_unixtime < 1455116661 THEN 'cnt2' 
        WHEN K.request_unixtime > 1455116661 AND K.request_unixtime < 1455721461 THEN 'cnt1' 
        WHEN K.request_unixtime > 1455721461 AND K.request_unixtime < 1456412661 THEN 'cnt' 
    END;

如果您要直接查看数据(而不是从前端/报告中调用此代码),那么您可能还想添加ORDER BY