2011-11-27 141 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这里