【问题标题】:How pivot and merge these 2 tables in mysql?如何在 mysql 中旋转和合并这两个表?
【发布时间】:2020-12-04 00:44:38
【问题描述】:

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

表1是Wordpress用户(users)表:

 标识 |用户登录 |用户邮箱 |其他无关字段。
 1 |约翰 |约翰@约翰 | ...
 2 |玛丽 |玛丽@玛丽 | ...
 3 |埃里克 |埃里克@eric | ……

表2是buddypress xprofile数据(bp_xprofile_data)表:

 标识 |用户 ID |字段 ID |价值
 1 | 1 | 1 |约翰是个男人。
 2 | 3 | 1 |埃里克是个男人。
 3 | 1 | 2 |约翰打网球。

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

用户 ID |用户登录 |用户邮箱 |字段1 |字段2 | ... 1 |约翰 |约翰@约翰 |约翰是个男人 |约翰打网球 2 |玛丽 |玛丽@玛丽 |空 |空值 3 |埃里克 |埃里克@eric |埃里克是个男人 |空值

我正在使用 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) 作为运动 FROM bp_xprofile_data D JOIN users U ON U.ID = D.user_id

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

有什么建议吗?

【问题讨论】:

  • 您可以考虑在应用程序代码中处理显示问题
  • 我也在尝试通过这个了解更多关于 mysql 的信息。您是否建议我尝试做的事情在 SQL 中是不可能的?如果是这样的话,我只会放弃。 (另外,我尝试将整个数据库导出到 excel 并尝试将其合并到那里,但我的 excel 比 sql 更差)...
  • 一切皆有可能。就我个人而言,我发现动态 sql 有点痛苦——尽管如果你使用 MySQL 8+,事情会更简单
  • 对我应该如何解决这个问题有什么想法吗?我应该只导出原始 sql 中的所有内容并尝试在其他地方合并/旋转它吗?
  • 不完全是您所需要的stackoverflow.com/questions/49680392/…,但“扁平化” bp_xprofile_data 的原则就在那里——这将是第一步,然后您将加入用户表。你可以通过搜索 MYSQL PIVOT WORDPRESS 来研究这个

标签: mysql wordpress phpmyadmin


【解决方案1】:

假设 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
);

其中 sub query s 获取所有不同的字段,从中构建一组聚合函数,然后用其他位进行扩充以创建有效的 sql 语句(您可以通过选择 @sql 看到),然后可以提交该语句到动态 sql -

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

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

【讨论】:

  • 谢谢!我试图弄清楚为什么连接是用来“旋转”表格的方法,但让我慢慢地学习。欣赏!
  • 重要的不是 concat,而是它产生的条件聚合。
猜你喜欢
  • 2011-10-11
  • 2016-11-06
  • 2015-05-29
  • 2010-10-18
  • 2012-11-08
  • 2020-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多