Я знаю, что должен быть способ сделать это, но для моей жизни я не могу понять:
У меня есть 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.
Использование:
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
То, что вы пытаетесь сделать, называется точкой опоры. MySQL не поддерживает поворот изначально, но вы можете сделать это, используя запрос OMG Ponies.
Однако, если вам нужно поддерживать произвольное количество полей профиля, вам придется динамически строить SQL.
Я думаю, что вы вообще не можете делать то, что хотите. Даже если пример @OMG Ponies верен, он не будет работать для других значений имен profile_field.
Вы можете попробовать написать код для генерации запроса для разных значений profile_fields на основе фактических полей профиля.
Или вы можете легко и просто соединить и проанализировать данные в другой программе/коде.
PROFILE_VALUES
а не к левому присоединению для пользователей без записей в таблицеPROFILE_VALUES
.