MySQL объединяет многие в многие как отдельные строки - PullRequest
0 голосов
/ 06 января 2010

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

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

users
uid mail
1   qq@qq.com
2   ww@ww.com
3   ee@ee.com

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   qq@qq.com   Q Q     5555555555
2   ww@ww.com   Ww Ww       NULL
3   ee@ee.com   NULL        44445454111

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

РЕДАКТИРОВАТЬ: Я также пытался поискать в Google, но я не могу понять, как сформулировать это в Google.

Ответы [ 3 ]

4 голосов
/ 06 января 2010

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

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
1 голос
/ 06 января 2010

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

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

0 голосов
/ 06 января 2010

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

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

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

...