[英]SQL Multiple values from same column with inner join
我希望将数据从一个表连接到另一个表。 我的问题在表二中,我需要的数据在同一列中。
这是使用wordpress / woocommerce数据库的,因此您可能会知道很多用户数据存储在用户元表中,并且您可以通过选择元值(其中元键= 某些内容)来提取数据
用户元表的粗略数据结构
id | user_id | meta_key | meta_value
现在,我从表1中选择表2的内部联接,并使用IN运算符基于meta_key选择我想要的元值
select wp_xxxxxx_users.ID, wp_xxxxxx_users.user_email, wp_xxxxxxxxx.meta_value
from wp_xxxxxx_users
INNER JOIN wp_xxxxxx_usermeta on wp_xxxxxx_users.ID=wp_xxxxxx_usermeta.user_id
WHERE wp_xxxxxx_usermeta.meta_key IN ('last_name', 'first_name')
现在,这将返回所有数据,但采用这种格式
id | user_email | meta_value
那怎么了 好吧,我希望meta_value列显示在同一行而不是多行
我希望输出执行以下操作
id | user_email | metavalue-first_name | metavalue-last_name
由于目前正在输出这样
1 | test@test.com | first name
1 | test@test.com | lastname name
2 | test1@test.com | first name
2 | test1@test.com | lastname name
我环顾了相关线程,并看到人们按Group By完成了此任务,但我无法使其正常工作
版本是MySQL 5.7.27
如果按ID,user_email分组并使用条件聚合,则可以执行以下操作:
select
u.ID, u.user_email,
max(case m.meta_key when 'first_name' then m.meta_value end) first_name,
max(case m.meta_key when 'last_name' then m.meta_value end) last_name
from wp_xxxxxx_users u inner join wp_xxxxxx_usermeta m
on u.ID = m.user_id
where m.meta_key IN ('last_name', 'first_name')
group by u.ID, u.user_email
您没有提供任何数据。 所以这张桌子
CREATE TABLE wp_xxxxxx_users (
ID int , user_email varchar(20));
INSERT INTO wp_xxxxxx_users (id,user_email) VALUES
(1,'test@mail.de'),
(2,'test1@mai.de'),
(3,'test2@mail.de');
CREATE TABLE wp_xxxxxx_usermeta
(`ID` int, `user_id` int, `meta_key` varchar(14), `meta_value` varchar(12))
;
INSERT INTO wp_xxxxxx_usermeta
(`ID`, `user_id`, `meta_key`, `meta_value`)
VALUES
(1, 1, 'last_name' , 'Dallas' ),
(2, 1, 'first_name' , 'Kermit' ),
(3, 2, 'last_name' , 'Huston' ),
(4, 2, 'first_name' , 'Piggy' ),
(5, 3, 'last_name' , 'Oklahoma' ),
(6, 3, 'first_name' , 'Beep' )
;
该Select语句
SELECT
wpu.ID
,wpu.user_email
, wpm.last_name
,wpm2.first_name
FROM wp_xxxxxx_users wpu
INNER JOIN
(SELECT meta_value as last_name, user_id FROM
wp_xxxxxx_usermeta Where meta_key = 'last_name') wpm
ON wpu.ID=wpm.user_id
INNER JOIN (SELECT meta_value as first_name, user_id from
wp_xxxxxx_usermeta WHERE meta_key = 'first_name') wpm2
ON wpu.ID=wpm2.user_id
;
或者你可以使用
Select wpu.ID
,MAX(wpu.user_email),
MAX(CASE WHEN wpm.meta_key = 'last_name' THEN wpm.meta_value END) last_name,
MAX(CASE WHEN wpm.meta_key = 'first_name' THEN wpm.meta_value END) first_name
From wp_xxxxxx_users wpu inner join wp_xxxxxx_usermeta wpm
ON wpu.ID=wpm.user_id
WHERE wpm.meta_key in ('last_name','first_name')
GROUP by wpu.ID;
给你以下结果
ID user_email last_name first_name
1 test@mail.de Dallas Kermit
2 test1@mai.de Huston Piggy
3 test2@mail.de Oklahoma Beep
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.