如何在 mysql 中旋转和合并这两个表?

How pivot and merge these 2 tables in mysql?

我有 2 个 wordpress table 正在尝试使用 SQL 合并,其中一个需要旋转才能合并(我认为)。

Table 1是Wordpress Users(用户)table:

 ID | user_login | user_email | other_irrelevant_fields.  
 1  | john       | john@john  | ...   
 2  | mary       | mary@mary  | ...
 3  | eric       | eric@eric  | ....

Table2是buddypress xprofile数据(bp_xprofile_data)table:

 ID | user_id | field_id | value   
 1  | 1       | 1        | John is a guy.  
 2  | 3       | 1        | Eric is a man.  
 3  | 1       | 2        | John plays tennis.  

我想合并这两个(通过 user_id),这样我得到这个结果:

 
 user_ID | user_login | user_email | field1         | field2            | ...
 1       | john       | john@john  | John is a guy  | John plays tennis 
 2       | mary       | mary@mary  | null           | null
 3       | eric       | eric@eric  | Eric is a man  | null  

我正在使用 phpmyadmin 和 mysql 5.6.41-84.1。这是我尝试做的事情 - 我不是很擅长 SQL 所以我正在以一种非常“手动”的方式做事。我也尝试搜索其他 SO 答案,但无法识别 PIVOT,并且大多数都提供了一些使用 PIVOT 的变体。

尝试过:

SELECT D.user_id , U.user_email, U.display_name, U.user_login, (SELECT D.value FROM bp_xprofile_data WHERE D.field_id =1) AS self_description, D.value FROM bp_xprofile_data WHERE D.field_id =2) AS sports FROM bp_xprofile_data D JOIN users U ON U.ID = D.user_id

显然这不起作用,因为子查询 returns 是 field_id=1 的完整匹配列表,而不仅仅是单个结果。但是当我使子查询有自己的内部连接时(丑陋!)整个事情也不起作用,因为子查询和主查询的 ID 匹配不同步。

有什么建议吗?

假设 bp_xprofile_data 中的字段数量未知且可变,第一步是获得尽可能多的字段,然后构建一个 sql 语句以供提交 所以

set @sql = (
select concat('select u.id,u.sname,user_id, ', gp,' from users u join bp_xprofile_data on u.id = user_id group by user_id')
from
(
select group_concat(
         concat('max(case when field_id = ',field_id,' then value  end) as field', field_id)
         )  gp
from  
(
select distinct field_id from bp_xprofile_data
) s
) t
);

其中子查询获取所有不同的字段,从中构建一组聚合函数,然后用其他位扩充以创建有效的 sql 语句(您可以通过选择 @[ 查看=19=]) 然后可以提交到动态 sql -

prepare sqlstmt from @sql;
execute sqlstmt;
deallocate prepare sqlstmt;

请注意,您的用户数据与我的略有不同,因此您需要稍微更改一下代码。