В MySQL, как вы динамически выбираете значения одной таблицы, как столбцы в другой? - PullRequest
3 голосов
/ 14 февраля 2012

Я не гуру MySQL, но довольно хорошо разбираюсь в базовых вещах. Спасибо за ваш отзыв.

У меня есть две таблицы user и favorite. Каждый пользователь может иметь несколько уникальных избранных.

пользователь таблицы

[ user_id + name  ]
  100     | Sally

фаворит стола

[ fav_id  + user_id +  fav_key  +  fav_val ]
  1       | 100     | icecream  |    mint
  2       | 100     | candybar  |  snickers
  3       | 100     | color     |    red

Я хочу создать оператор SELECT, который превратит избранные пользователя в столбцы, используя значение fav_key в качестве заголовка столбца. * Проблема в том, что я никогда не узнаю, какое значение будет fav_val, поскольку они вводятся пользователем, поэтому имена столбцов должны генерироваться динамически.

SELECT ...

[ user_id + name  + fav_icecream + fav_candybar + fav_color ]
  100     | Sally |    mint      |   snickers   |   red 

С некоторой отдаленной мыслью о производительности - одна из проблем заключается в том, что я не хочу запускать два оператора SELECT для получения пользовательских данных и пользовательских фаворитов (плюс мне нравится идея иметь столбцы динамически назван таким образом).

UPDATE

Так что это называется, разворот, отлично.

Что если я никогда не узнаю, что это за значения? Мне нужно динамически генерировать столбцы из запроса на избранное.

Ответы [ 2 ]

4 голосов
/ 14 февраля 2012

Как это:

Select fav.user_id, u.name 
       MAX(case WHEN fav.fav_key = 'icecream' then fav.fav_val end) as 'fav_icecream',
       MAX(case WHEN fav.fav_key = 'candybar'  then fav.fav_val end) as 'fav_candybar',
       MAX(case WHEN fav.fav_key = 'color'    then fav.fav_val end) as 'fav_color'
From favorite fav
     inner join users u on fav.user_id = u.user_id
group by fav.user_id

Рабочий пример: DEMO

Обратите внимание, что: Демонстрация для MS SQL Server, но она работает так же для MySQL, я просто попытался дать вам живую демонстрацию.

3 голосов
/ 14 февраля 2012

По сути, вы хотите PIVOT функциональность.К сожалению, это не поддерживается MySQL изначально (в отличие от Oracle или SQL Server).Есть много вопросов о StackOverflow, показывающих, как обойти эту недостающую функциональность MySQL:

https://stackoverflow.com/search?q=mysql+pivot+sql

Некоторые примеры:

...