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;
我需要旋转 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;