2012-04-07 2 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 

Как вы можете видеть, таблица имеет просмотров страниц (НСТ) в день (_DATE) для каждого пользователя (user_id). Я ищу для 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 

Возможно ли это сделать с ЗЕЬЕСТ?

+1

Я не думаю, что это возможно в MySQL, поскольку она не включает в себя команду «Стержень» ... могли бы хотеть думать о реализации этой логики в свой прикладного уровня. – McGarnagle

+0

Вы ищете фиксированное количество столбцов (для фиксированного набора 'user_id') или для каждого' user_id' в таблице? –

+0

Фиксированная сумма. Есть сто user_id. См. OP edit :-) – Pr0no

ответ

4

Если вы имеете дело с конечным набором идентификаторов пользователей, вы могли бы сделать что-то вроде этого:

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

+0

Спасибо! Однако этот запрос дает мне ошибку: '# 1064 - У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с) AS user1, SUM (CASE WHEN user_id = 2 THEN cnt ELSE 0) AS user2, 'в строке 3' Какие-либо предложения относительно того, почему это происходит? – Pr0no

+0

@ Pr0no Я оставил 'END'; теперь пример исправлен. Вы могли бы подумать об этом, если бы посмотрели 'CASE' в документации MySQL. – benzado

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