问题 在mysql上将多行合并为一行和多列


我在MYSQL中工作,需要提取用户数据以进入视图。我将在电子邮件客户端中使用数据,因此我无法在应用层中执行此操作。

问题是用户的每个数据字段都包含在单独的行中(这就是Wordpress设置数据结构的方式)。

例如,wp_usermeta为每个用户提供了多行数据,如下所示:

user_id   meta_key       meta_data
   2      first_name     Jane
   2      last_name      Austin
   2      email          jane@me.com
   3      first_name     Jack
   3      last_name      Palmer
   3      email          jack@me.com

我需要将数据合并为一行,单独的字段,如下所示:

user_id  first_name  last_name  email
2        Jane        Austin     jane@email.com
3        Paul        Parker     jack@email.com

我四处搜索,无法在任何地方找到这个确切的问题(我发现很多连接,但这不是我需要的)。


2893
2017-11-27 03:54


起源

你只关心firstName,lastName和Email吗? - Adam Wenger


答案:


如果这些是您唯一关注的列,这将适合您:

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'

13
2017-11-27 04:02



感谢Adam的快速反应。我试图运行查询,但所有数据字段都由列名填充,而不是实际数据。因此first_name的所有数据都是'first_name'等.SELECT um.user_id,fn.meta_key AS first_name,ln.meta_key AS last_name,e.meta_key AS email FROM wp_usermeta AS um LEFT JOIN wp_usermeta AS fn ON um.user_id = fn。 user_id AND fn.meta_key ='first_name'LEFT JOIN wp_usermeta AS ln ON um.user_id = ln.user_id AND ln.meta_key ='last_name'LEFT JOIN wp_usermeta AS e ON um.user_id = e.user_id AND e.meta_key ='email “ - katemerart
@katemerart你的 SELECT 正在使用 meta_key 代替 meta_data 就像我的回答是暗示的。如果您复制/粘贴我的答案并运行它,您应该得到您想要的结果。 - Adam Wenger
亚当 - 做到了 - 谢谢!我不得不添加DISTINCT以避免获取相同数据的多行,但我得到了它的工作。非常感谢!!! - katemerart


这是另一个不需要额外连接操作的解决方案,而是我们使用 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演示 这里


2
2018-06-03 04:46





之前的答案和评论给出了正确的解决方案。这是复制和粘贴的工作查询(在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'

0
2018-03-14 11:08