【问题标题】:Merging multiple rows into one row and multiple columns on mysql在mysql上将多行合并为一行多列
【发布时间】:2011-11-27 03:54:24
【问题描述】:

我在 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

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

【问题讨论】:

  • 您只关心名字、姓氏和电子邮件吗?

标签: mysql sql


【解决方案1】:

如果这些是您唯一关心的列,那么这对您有用:

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'

【讨论】:

  • 感谢亚当的快速回复。我尝试运行查询,但所有数据字段都由列名填充,而不是实际数据。因此,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 您的SELECT 正在使用meta_key 而不是meta_data,就像我的回答所暗示的那样。如果您复制/粘贴我的答案并运行它,您应该会得到您想要的结果。
  • 亚当 - 做到了 - 谢谢!我不得不添加 DISTINCT 以防止获得多行相同的数据,但我得到了它的工作。非常感谢!!!
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-02
      • 1970-01-01
      • 1970-01-01
      • 2012-08-29
      • 2010-11-07
      • 1970-01-01
      • 1970-01-01
      • 2020-06-09
      相关资源
      最近更新 更多