繁体   English   中英

SQL具有内部联接的同一列中的多个值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM