2015-03-31 2 views
0

Я ищу для поворота одного столбца данных в несколько строк на основе идентификатора пользователя в MySQL - я бы предпочел сделать это с помощью SQL-запроса, а не внешнего инструмента.MySQL pivot column

Моя конкретная ситуация кажется довольно простой, но я не могу понять ее на основе различных аргументов/ответов/примеров, которые я нашел.

Вот таблица у меня есть на данный момент:

╔════════╦═════════╦═════════╗ 
║ userID ║ object ║ index ║ 
╠════════╬═════════╣═════════╣ 
║ user1 ║ Apple ║ 1 ║ 
║ user1 ║ Orange ║ 2 ║ 
║ user1 ║ Pear ║ 3 ║ 
║ user2 ║ Kiwi ║ 1 ║ 
║ user2 ║ Melon ║ 2 ║ 
║ user2 ║ Mango ║ 3 ║ 
║ user3 ║ Apple ║ 1 ║ 
║ user3 ║ Melon ║ 2 ║ 
║ user3 ║ Pear ║ 3 ║ 
║ user3 ║ Mango ║ 4 ║ 
╚════════╩═════════╩═════════╝ 

И это желаемый результат:

╔════════╦═════════╦═════════╦═════════╦═════════╗ 
║ userID ║ 1 ║ 2 ║ 3 ║ 4 ║ 
╠════════╬═════════╬═════════╬═════════╬═════════╣ 
║ user1 ║ Apple ║ Orange ║ Pear ║ empty ║ 
║ user2 ║ Kiwi ║ Melon ║ Mango ║ empty ║ 
║ user3 ║ Apple ║ Melon ║ Pear ║ Mango ║ 
╚════════╩═════════╩═════════╩═════════╩═════════╝ 

Несколько вещей, чтобы отметить:

  • Колонны, после того, как userID, должен быть индексом объектов для данного пользователя
  • Объекты будут отображаться в том же порядке (я думаю, это то, что один столбец столбца/строки все равно)
  • Число объектов на идентификатор пользователя равно переменной - количество столбцов должно соответствовать максимальному количеству объектов одного пользователя. В приведенном выше примере пользователь3 имеет 4 объекта, поэтому у нас есть 4 столбца после столбца userID, хотя у других пользователей меньше объектов. Я рад оставить пустые записи, когда у пользователя нет данных для этого столбца.

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

Редактировать: Я немного изменил таблицы, основанные на комментарии Гордона Линоффа, чтобы включить индекс упорядочения, который у меня есть как часть исходной таблицы.

Кроме того, альтернативный вариант того же вопроса, основанный на ответе Гордона.

Если я знаю переднее максимальное количество столбцов, которые должны иметь (в этом примере 4 для объектов), это упрощает? например Я могу создать таблицу с 5 столбцами, прежде чем запускать свой запрос.

+1

Таблицы SQL представляют собой * неупорядоченные * наборы. В таблице нет упорядочения строк, если только столбец не указывает порядок. У вас есть такая колонна? –

+0

Это очень хороший момент.У меня действительно есть столбец, который я мог бы использовать для указания oder (и, возможно, заголовков столбцов). Но на неупорядоченных множествах - всякий раз, когда я использовал select, он всегда давал мне столбцы в том же порядке, что и таблица, в которой он хранился? (мои таблицы автоматически увеличиваются с столбцом идентификатора по умолчанию, который он дает мне в innoDB). – Hobsie

ответ

1

Вы не можете легко делать то, что вы хотите по двум важным причинам:

  • таблицы SQL представляют собой неупорядоченные наборы, так что нет заказа, если столбец не определяет порядок.
  • Исправлены столбцы в инструкции SQL.

Что может быть достаточно близко, чтобы поместить все значения в одном столбце:

select userId, group_concat(object) 
from table t 
group by userId; 

Вы можете модифицировать group_concat() с separator и order by указать разделитель (по умолчанию запятая) или для конкретного упорядоченность.

Если вы действительно хотите переменное количество столбцов, вам придется использовать динамический SQL - prepare и exec.

+0

Это несчастливо, но ваша предлагаемая работа действительно действительно очень близка к тому, что мне особенно нравится, если я экспортирую в csv и удаляю цитаты. Раздражает то, что я, скорее всего, придется использовать внешнее решение части. (Привет, я соглашусь на это как на ответ, если никто другой не передумает с лучшим решением) – Hobsie