2010-01-06 73 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 

我已經試過各種選擇具有不同的連接條件,但我似乎無法弄清楚如何獲得profile_fields的行我的列在我的選擇

編輯:我也嘗試了谷歌搜索周圍,但我似乎無法弄清楚如何將這句話谷歌。

+0

已更新 - 缺少的行可能是因爲我加入了「PROFILE_VALUES」表,而不是「PROFILE_VALUES」表中沒有記錄的用戶的LEFT JOINing。 – 2010-01-06 16:38:15

+0

我試過把它作爲一個左連接,仍然只是在行上。我會看看使用Views Bonus Pack來製作至少這個報告。 – 2010-01-06 16:51:44

回答

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

這就是我害怕不得不做的。這就是生活。 謝謝! – 2010-01-06 16:01:37

+0

_amlost_起作用。但我只得到一行,而不是所有的行。我嘗試關閉MAX()調用,但它完全打開了它,併爲每個字段提供了一行。 – 2010-01-06 16:20:30

1

你所試圖做的是叫做支點。 MySQL本身不支持pivoting,但你可以使用查詢OMG Ponies發佈。

但是,如果您必須支持任意數量的配置文件字段,則必須動態構建SQL。

+1

從技術角度來說,這只是一個適用範圍,但對於我的目的而言,我只能手工維護查詢。在將來,我可能會嘗試找出一種通過存儲過程完成此操作的方法,並且能夠動態生成查詢。 – 2010-01-06 16:01:07

0

我認爲一般情況下你不能做你想做的事。即使@OMG Ponies示例正確,它也不適用於profile_field名稱的其他值。

您可以嘗試編寫一些代碼,以基於實際profile_fields爲profile_fields的不同值生成查詢。

或者您可以在其他程序/代碼中進行簡單的多對多連接和分析數據。

+0

這將工作,但問題是我使用SQL查詢來生成一個XLS報告,所以我需要在純SQL中。我正在調查使用Drupal模塊來做到這一點,但我不確定它是否可以導出爲XLS。 – 2010-01-06 16:05:53