MySQL - объединение таблиц и превращение определенных строк в «виртуальные» столбцы - PullRequest
1 голос
/ 13 февраля 2011

Я делаю несколько запросов к базе данных на Wordpress. Я присоединяюсь к таблице usermeta и таблице users.

таблица пользователей имеет одну строку для каждого пользователя. таблица usermeta имеет несколько строк для каждого пользователя, так как «meta_keys» (категории метаданных каждого пользователя) может содержать все виды информации.

В запросе я хотел бы создать результирующий набор, содержащий только одну строку для каждого пользователя и дополнительные столбцы для выбранных значений meta_key.

например. наличие дополнительных столбцов с псевдонимом - он должен показывать содержимое usermeta.meta_value, когда usermeta.meta_keys = 'nickname'.

Вот мой текущий запрос с нежелательным дублированием строк

SELECT 
wusers.ID,
wusers.user_login, 
wusers.display_name,
wmeta.meta_key,
wmeta.meta_value,
wmeta.user_id   
FROM
  $wpdb->users wusers
  INNER JOIN $wpdb->usermeta wmeta ON wusers.ID = wmeta.user_id
WHERE 1 = 1
AND wmeta.meta_key = 'nickname'
OR wmeta.meta_key = 'description'
OR wmeta.meta_key = 'userphoto_thumb_file'

Есть ли какая-нибудь магия MySQL, которую я могу использовать, чтобы превратить данные определенных строк в новые "виртуальные" столбцы?

1 Ответ

3 голосов
/ 13 февраля 2011

То, что вы ищете, обычно называется кросс-таблицей:

Select U.Id
    , Min( Case When M.meta_key = 'nickname' Then M.meta_value End ) As nickname
    , Min( Case When M.meta_key = 'description' Then M.meta_value End ) As description
    , Min( Case When M.meta_key = 'userphoto_thumb_file' Then M.meta_value End ) As userphoto_thumb_file
From users As U
    Join usermeta As M
        On M.user_id = U.id
Group By U.id

Следует отметить, что вы можете делать это только со статическим SQL и статическими столбцами.Сам язык SQL не был предназначен для динамической генерации столбцов.Для динамической сборки столбцов вам необходимо динамически собрать запрос (он же динамический SQL) в коде среднего уровня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...