2011-11-27 83 views
10

我在MYSQL中工作,需要提取用戶數據才能被拖入視圖。我將在電子郵件客戶端中使用這些數據,因此我無法在應用層中執行此操作。在mysql中將多行合併爲一行和多列

問題是用戶的每個數據字段都包含在不同的行中(這是Wordpress設置數據結構的方式)。

例如,wp_usermeta具有多行數據爲每個用戶是這樣的:

user_id meta_key  meta_data 
    2  first_name  Jane 
    2  last_name  Austin 
    2  email   [email protected] 
    3  first_name  Jack 
    3  last_name  Palmer 
    3  email   [email protected] 

我所需要的數據被組合成一個行中,單獨的字段,例如:

user_id first_name last_name email 
2  Jane  Austin  [email protected] 
3  Paul  Parker  [email protected] 

我已經四處搜尋,無法在任何地方找到這個確切的問題(我發現了很多連接,但這不是我所需要的)。

+2

你只關心firstName,lastName和Email嗎? –

回答

12

如果這些是你所關心的只是列,這會爲你工作:

SELECT um.user_id 
    , fn.meta_data AS first_name 
    , ln.meta_data AS last_name 
    , e.meta_data AS email 
FROM wp_userMeta AS um 
LEFT JOIN wp_user_Meta AS fn ON um.user_id = fn.user_id 
    AND fn.meta_key = 'first_name' 
LEFT JOIN wp_user_Meta AS ln ON um.user_id = ln.user_id 
    AND ln.meta_key = 'last_name' 
LEFT JOIN wp_user_Meta AS e ON um.user_id = e.user_id 
    AND e.meta_key = 'email' 
+0

感謝Adam的快速回應。我試圖運行查詢,但所有數據字段都由列名填充,而不是實際數據。因此,對於所有的FIRST_NAME數據是 'FIRST_NAME' 等 選擇um.user_id,fn.meta_key AS FIRST_NAME,ln.meta_key AS姓氏,e.meta_key如電子郵件 FROM wp_usermeta AS嗯 LEFT JOIN wp_usermeta AS FN ON um.user_id = fn.user_id AND fn.meta_key = '如first_name' LEFT JOIN wp_usermeta爲ln ON um.user_id = ln.user_id AND ln.meta_key = '姓氏' LEFT JOIN wp_usermeta AS E對um.user_id = e.user_id AND e.meta_key ='email' – katemerart

+0

@katemerart您的'SELECT'正在使用'meta_key'而不是'meta_data',就像我的回答所暗示的那樣。如果你複製/粘貼我的答案並運行它,你應該得到你想要的結果。 –

+0

亞當 - 做到了 - 謝謝!我不得不添加DISTINCT以避免獲取相同數據的多行,但我得到了它的工作。非常感謝!!! – katemerart

0

以前的答案和意見給予正確的解決方案。這裏是工作的查詢(在架構WP 3.1)複製和粘貼...

SELECT distinct u.id, u.user_email, 
    fn.meta_value AS first_name, 
    ln.meta_value AS last_name 
FROM wp_users AS u 
LEFT JOIN wp_usermeta AS fn ON u.id = fn.user_id 
    AND fn.meta_key = 'first_name' 
LEFT JOIN wp_usermeta AS ln ON u.id = ln.user_id 
    AND ln.meta_key = 'last_name' 
1

這裏是另一種解決方案,並不需要額外的連接操作,相反,我們利用group by聲明連同case聲明。

select um.user_id, 
     max(case when um.meta_key ='first_name' then um.meta_data end) AS first_name, 
     max(case when um.meta_key ='last_name' then um.meta_data end) AS last_name , 
     max(case when um.meta_key ='email' then um.meta_data end) AS email 
from wp_usermeta um 
group by user_id; 

注意max功能只是爲了讓他們到一排,你可以使用min爲好。

檢查SQL Fiddler Demo這裏