MySQL объединяет многие в многие как отдельные строки

0

Я знаю, что должен быть способ сделать это, но для моей жизни я не могу понять:

У меня есть 3 таблицы, которые я хочу объединить (упростить для иллюстрации):

users
uid mail
1   [email protected]
2   [email protected]
3   [email protected]

profile_fields
fid name        label
1   full_name   Full Name
2   phone       Phone

profile_values
uid fid value
1   1   Q Q
1   2   5555555555
2   1   Ww Ww
3   2   4444525411

Я хотел бы получить результаты формы:

uid mail        full_name   phone
1   [email protected]   Q Q     5555555555
2   [email protected]   Ww Ww       NULL
3   [email protected]   NULL        44445454111

Я пробовал различные SELECT с разными условиями JOIN, но я не могу понять, как заставить строки профилей быть моими столбцами в моем SELECT

EDIT: Я также пробовал поиск по Google, но я не могу понять, как это сделать для Google.

  • 0
    Обновлено - пропущены строки, вероятно, потому, что я присоединялся к таблице PROFILE_VALUES а не к левому присоединению для пользователей без записей в таблице PROFILE_VALUES .
  • 0
    Я попытался сделать это левым соединением, все еще только в ряд. Я собираюсь посмотреть, как использовать Views Bonus Pack, чтобы сделать хотя бы этот отчет.
Теги:
pivot
join

3 ответа

4
Лучший ответ

Использование:

SELECT u.uid,
       u.mail,
       MAX(CASE WHEN pf.name = 'full_name' THEN pv.value END) AS full_name,
       MAX(CASE WHEN pf.name = 'phone' THEN pv.value END) AS phone
  FROM USERS u
  LEFT JOIN PROFILE_VALUES pv ON pv.uid = u.uid
  JOIN PROFILE_FIELDS pf ON pf.fid = pv.fid
                        AND pf.name IN ('full_name', 'phone')
GROUP BY u.uid, u.mail
  • 0
    Вот чего я боялся делать. Такова жизнь. Спасибо!
  • 0
    Это все работает. Но я получаю только один ряд, а не все ряды. Я попытался убить вызовы MAX (), но он полностью уносит меня и дает мне по одной строке на поле.
1

То, что вы пытаетесь сделать, называется точкой опоры. MySQL не поддерживает поворот изначально, но вы можете сделать это, используя запрос OMG Ponies.

Однако, если вам нужно поддерживать произвольное количество полей профиля, вам придется динамически строить SQL.

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

Я думаю, что вы вообще не можете делать то, что хотите. Даже если пример @OMG Ponies верен, он не будет работать для других значений имен profile_field.

Вы можете попробовать написать код для генерации запроса для разных значений profile_fields на основе фактических полей профиля.

Или вы можете легко и просто соединить и проанализировать данные в другой программе/коде.

  • 0
    Это бы сработало, но проблема в том, что я использую запрос SQL для генерации отчета XLS, поэтому мне нужно быть на чистом SQL. Я исследую использование модуля Drupal для этого, но я не уверен, может ли он экспортироваться как XLS.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню