2012-04-07 78 views
3

考慮下表 「意見」選擇行作爲MySQL中的列?

user_id _date  cnt 
------------------------ 
1  2011-02-10 123 
1  2011-02-11 99 
1  2011-02-12 100 
1  2011-02 13 12 
2  2011-02-10 32 
2  2011-02-11 433 
2  2011-02-12 222 
2  2011-02 13 334 
3  2011-02-10 766 
3  2011-02-11 654 
3  2011-02-12 43 
3  2011-02 13 27 
... 
100  2011-02-13 235 

正如你可以看到,該表保存每個用戶(USER_ID)每天瀏覽量(CNT)(_DATE)。我在尋找一個SELECT查詢,將輸出user_ids爲列,因此表的數據將是矩陣形式,如下:

_date   1 2 3 ... 100 
--------------------------------- 
2011-02-10 123 32 766 
2011-02-11 99 433 654 
2011-02-12 100 222 43 
2011-02-13 12 334 27  235 

這是可以做到的SELECT語句?

+1

我不認爲這是在MySQL中儘可能不包括「轉動」命令可能要考慮實施這個邏輯你應用程序層。 – McGarnagle 2012-04-07 23:39:47

+0

您是否正在尋找固定數量的列(對於一組固定的'user_id')或表中的每個'user_id'? – 2012-04-07 23:41:32

+0

固定金額。有一百個user_id。看到OP編輯:-) – Pr0no 2012-04-07 23:52:28

回答

4

如果你正在處理一組有限的用戶ID,你可以做這樣的事情:

SELECT _date, 
    SUM(CASE WHEN _user_id = 1 THEN cnt ELSE 0 END) AS user1, 
    SUM(CASE WHEN _user_id = 2 THEN cnt ELSE 0 END) AS user2, 
    SUM(CASE WHEN _user_id = 3 THEN cnt ELSE 0 END) AS user3, 
    ... 
FROM views 
GROUP BY _date 

它更像是一個黑客不是一個很好的查詢,但。

+1

事實上,如果你正在處理一個大型的數據集,期待緩慢的查詢。最好的解決方法,但! – BenOfTheNorth 2012-04-08 00:03:50

+0

謝謝!但是,這個查詢給我一個錯誤:'#1064 - 你的SQL語法有錯誤;檢查與您的MySQL服務器版本相對應的手冊,以獲得在''附近使用的正確語法')AS user1,SUM(CASE WHEN user_id = 2 THEN cnt ELSE 0)AS user2,'at line 3'有任何關於爲什麼發生這種情況的建議? – Pr0no 2012-04-09 12:01:15

+0

@ Pr0no我遺漏了'END';該示例現在已修復。如果你在MySQL文檔中查找「CASE」,你可能已經想出了自己的想法。 – benzado 2012-04-09 20:33:13

0

看起來你有一個很長的值列表,你想要轉換。如果是這種情況,那麼你可以使用prepared statements。您的代碼看起來像這樣(見SQL Fiddle with Demo):

CREATE TABLE Table1 
    (`user_id` int, `_date` datetime, `cnt` int) 
; 

INSERT INTO Table1 
    (`user_id`, `_date`, `cnt`) 
VALUES 
    (1, '2011-02-09 17:00:00', 123), 
    (1, '2011-02-10 17:00:00', 99), 
    (1, '2011-02-11 17:00:00', 100), 
    (1, '2011-02-13 00:00:00', 12), 
    (2, '2011-02-09 17:00:00', 32), 
    (2, '2011-02-10 17:00:00', 433), 
    (2, '2011-02-11 17:00:00', 222), 
    (2, '2011-02-13 00:00:00', 334), 
    (3, '2011-02-09 17:00:00', 766), 
    (3, '2011-02-10 17:00:00', 654), 
    (3, '2011-02-11 17:00:00', 43), 
    (3, '2011-02-13 00:00:00', 27), 
    (100, '2011-02-12 17:00:00', 235) 
; 

SET @sql = NULL; 
SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT(
     'sum(case when user_id = ''', 
     user_id, 
     ''' then cnt else 0 end) AS ''', 
     user_id, '''' 
    ) 
) INTO @sql 
FROM Table1; 

SET @sql = CONCAT('SELECT _Date, ', @sql, ' 
        FROM table1 
        GROUP BY _Date'); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt;