MySQL - 在 2 个表上旋转一对多关系

标签 mysql pivot

我需要旋转一个表,它可以为一个 View 完成,也可以将数据转储到一个已经设置为旋转表的预先存在的表中。我的主要问题是了解如何选择和转换数据。

示例数据

表 1:

user_id       user_email       first_name       last_name
-------------------------------------------------------------
1             jdoe@huh.com     John             Doe
2             jcarter@aol.com  Jimmy            Carter

表 2:

user_id       type       job_title       job_description
---------------------------------------------------------
1             Job 1      Some Job        play all day!
1             Job 2      Another Job     all work no play!
2             Job 1      Clown           IT's not funny

透视表
我想要实现的是:
为了便于使用,我缩短了表名和数据。

uid    email    fname    lname    jtitle-1    jdesc-1    jtitle-2    jdesc-2
----------------------------------------------------------------------------
1      jdoe@>  John     Doe      Some Job    play all>   Another J>  all wo>
2      jcar@>  Jimmy    Carter   Clown       IT's not>   null        null

我四处寻找了一些例子,但没有一个是我正在寻找的。

MySQL pivot table
http://stratosprovatopoulos.com/web-development/mysql/pivot-a-table-in-mysql/


更新
自然地,在发布这篇文章后不久我就找到了解决方案。
http://stratosprovatopoulos.com/web-development/mysql/pivot-table-with-dynamic-columns/

这样就可以了
MAX(IF(pa.fieldname = ‘size’, pa.fieldvalue, NULL)) AS 大小

最佳答案

您正在寻找的是 Joe Celko(Smarties 的 SQL)风格的枢轴,通过对主表的主键进行分组并根据相对“类型”有选择地挑选表 2 值.

SELECT u.user_id AS uid,
    u.user_email AS email,
    u.first_name AS fname,
    u.last_name AS lname,
    MAX(CASE WHEN j.type = 'Job 1' THEN j.job_title ELSE NULL END) AS `jtitle-1`,
    MAX(CASE WHEN j.type = 'Job 1' THEN j.job_description ELSE NULL END) AS `jdesc-1`,
    MAX(CASE WHEN j.type = 'Job 2' THEN j.job_title ELSE NULL END) AS `jtitle-2`,
    MAX(CASE WHEN j.type = 'Job 2' THEN j.job_description ELSE NULL END) AS `jdesc-2`,
    MAX(CASE WHEN j.type = 'Job 3' THEN j.job_title ELSE NULL END) AS `jtitle-3`,
    MAX(CASE WHEN j.type = 'Job 3' THEN j.job_description ELSE NULL END) AS `jdesc-3`,
    MAX(CASE WHEN j.type = 'Job 4' THEN j.job_title ELSE NULL END) AS `jtitle-4`,
    MAX(CASE WHEN j.type = 'Job 4' THEN j.job_description ELSE NULL END) AS `jdesc-4`,
    MAX(CASE WHEN j.type = 'Job 5' THEN j.job_title ELSE NULL END) AS `jtitle-5`,
    MAX(CASE WHEN j.type = 'Job 5' THEN j.job_description ELSE NULL END) AS `jdesc-5`
FROM users AS u
LEFT JOIN jobs AS j ON j.user_id = u.user_id
GROUP BY u.user_id;

关于MySQL - 在 2 个表上旋转一对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43768822/

相关文章:

SQL Server PIVOT 函数

sql-server - SQL Server 数据透视与多重联接

sql - T-SQL 枢轴 : One row to column name and the other to value

php - Store_result 和 get_result 语句

laravel - 2 个带有数据透视表的模型,多对多关系

MySQL 将行转为动态数量的列

php - 基于结果的选择中选择 MySQL

mysql - Laravel 多对多(在同一用户表/模型上): Query scopes to include related for the specified user

PHP更新用户信息

java - Netbeans Java Web 应用程序部署到 Web 主机