如何在 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;
请注意,您的用户数据与我的略有不同,因此您需要稍微更改一下代码。
我有 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 FROMbp_xprofile_data
WHERE D.field_id =2) AS sports FROMbp_xprofile_data
D JOINusers
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;
请注意,您的用户数据与我的略有不同,因此您需要稍微更改一下代码。