我在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
我已经四处搜索,无法在任何地方找到这个确切的问题(我发现了很多连接,但这不是我需要的。)
答案 0 :(得分:13)
如果这些是您唯一关注的列,这将适合您:
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'
答案 1 :(得分:3)
这是另一个不需要额外连接操作的解决方案,相反,我们使用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
答案 2 :(得分: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'