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

MySQL - Pivoting a one-to-many relationship over 2 tables

我需要旋转 table,它既可以用于视图,也可以将数据转储到已经设置为旋转 table 的预先存在的 table 中。我的主要问题是知道如何 SELECT 和数据透视。

示例数据

Table 1:

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

Table 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

旋转 TABLE
我想要实现的是:
为了便于使用,我缩短了 table 名称和数据。

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

我四处寻找了一些示例,但 none 正是我要找的。

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 size

您正在寻找的是 Joe Celko(SQL 聪明人)风格的枢轴,通过在主要 table 上分组PK 并根据相对 "type".

选择 table-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;