2010-01-06 2 views
0

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

У меня есть 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

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

+0

Обновлено - недостающие строки, вероятно, потому, что я присоединился к таблице 'PROFILE_VALUES', а не LEFT JOINING для пользователей без записей в таблице' PROFILE_VALUES'. –

+0

Я пробовал сделать его левым, все еще только попадая в ряд. Я собираюсь посмотреть, как использовать бонусный пакет Views, чтобы сделать хотя бы этот отчет. –

ответ

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

Это _amlost_ работает. Но я получаю только одну строку, а не все строки. Я попытался убить вызовы MAX(), но он полностью ударил um и дал мне одну строку в поле. –

1

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

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

+1

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

0

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

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

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

+0

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