2011-05-08 26 views
0

考慮這個查詢:簡單的數據透視查詢幫助

SELECT COUNT(*) AS pageviews 
FROM stats_hits 
WHERE pageID='1' AND entrytime>DATE_SUB(now(), INTERVAL 5 DAY) 
GROUP BY DATE(`entrytime`) LIMIT 5 

返回命中計數爲過去的五天裏:是這樣的:

11 
12 
18 
15 
5 

我怎麼可以重寫此查詢返回水平結果集?

11, 12, 18, 15, 5 

謝謝!

編輯:作爲一個側面的問題,沒有人知道如何調整此查詢顯示爲0沒有命中的日子?此刻如果某一天沒有點擊,則只返回4個結果。

回答

1
SELECT GROUP_CONCAT(s.pageviews) AS pageviews 
FROM 
    (
    SELECT COUNT(*) AS pageviews 
    FROM stats_hits 
    WHERE pageID='1' AND entrytime>DATE_SUB(now(), INTERVAL 5 DAY) 
    GROUP BY DATE(`entrytime`) LIMIT 5 
) s; 

參見:http://dev.mysql.com/doc/refman/5.1/en/group-by-functions.html#function_group-concat

如果你想永遠有5個結果,這樣的事情醜陋的黑客攻擊可能會奏效。

SELECT GROUP_CONCAT(s2.pageviews) AS pageviews 
FROM 
    (
    SELECT * FROM 
    (
    SELECT COUNT(*) AS pageviews 
    FROM stats_hits 
    WHERE pageID='1' AND entrytime>DATE_SUB(now(), INTERVAL 5 DAY) 
    GROUP BY DATE(`entrytime`) LIMIT 5 
    UNION ALL SELECT 0 AS pageviews 
    UNION ALL SELECT 0 AS pageviews 
    UNION ALL SELECT 0 AS pageviews 
    UNION ALL SELECT 0 AS pageviews 
    UNION ALL SELECT 0 AS pageviews 
    ) s1 
    ORDER BY pageviews = 0 ASC 
    LIMIT 5) s2; 

另一種選擇是這

CREATE TEMPORARY TABLE temp_table LIKE SELECT 0 as pageviews; 
INSERT INTO temp_table VALUES (0),(0),(0),....,(0); 
INSERT INTO temp_table 
    SELECT COUNT(*) AS pageviews 
    FROM stats_hits 
    WHERE pageID='1' AND entrytime>DATE_SUB(now(), INTERVAL x DAY) 
    GROUP BY DATE(`entrytime`) LIMIT x; //replace x with the number of days 

SELECT GROUP_CONCAT(t.pageviews) AS pageviews 
FROM temp_table t 
ORDER BY t.pageview = 0 ASC 
LIMIT x; //replace x with the number of days 
+0

感謝約翰 - 漂亮的快速和骯髒的支點技術。我會記住這一點!我有時不得不查看最近的30或60天,以免上面的黑客無法正常工作。而且它看起來並不像保持結果的順序,我可能也需要。無論如何,非常感謝幫助。 – cronoklee 2011-05-08 15:53:53

+0

@cronoklee,'group by'按'entrytime'排序結果。中間子查詢中的'order by'不會改變這個順序,不過你可以在內部或外部選擇中添加'order by'。 – Johan 2011-05-08 16:01:25

+0

哇看起來很棒 - 謝謝@約翰。我假設在'VALUES(0),(0),(0),...,(0);'我需要添加一個(0)我每天要計數? – cronoklee 2011-05-08 16:21:00