如何简化MySQL将连接行作为列?

时间:2018-11-13 05:05:14

标签: mysql join

目前,我有一张班主任的成绩表。我正在尝试将行作为列联接。从本质上讲,该结果应提供不同年份班长的性别概况。

名为results的表:

+----+------+---------+--------+----------+-----------+-------+----------+-----------+
| id | year | faculty | winner | w_gender | w_percent | loser | l_gender | l_percent |
+----+------+---------+--------+----------+-----------+-------+----------+-----------+
|  1 | 2016 | Yellow  | Tom    | B        |        56 | Jill  | G        |        46 |
|  2 | 2016 | Green   | Susan  | G        |        52 | Sandy | G        |        48 |
|  3 | 2016 | Purple  | Carly  | G        |        51 | Jax   | B        |        49 |
|  4 | 2018 | Yellow  | Tom    | B        |        56 | Jill  | G        |        46 |
|  5 | 2018 | Green   | Ben    | B        |        52 | Sandy | G        |        48 |
|  6 | 2018 | Purple  | Amanda | G        |        52 | James | B        |        48 |
+----+------+---------+--------+----------+-----------+-------+----------+-----------+

预期结果:

+--------+------+------+
| group  | 2016 | 2018 |
+--------+------+------+
| yellow | B    | G    |
| green  | G    | G    |
| purple | G    | B    |
+--------+------+------+

有效 MySQL查询,已从MySQL Join Multiple Rows as Columns修改:

SET @sql = NULL;
SELECT GROUP_CONCAT(DISTINCT CONCAT('MAX(CASE WHEN year = ', year, ' THEN w_gender END) AS ', CONCAT('`', year, '`')) ORDER BY year ASC) INTO @sql FROM results;
SET @sql = CONCAT('SELECT faculty, ', @sql, ' FROM results GROUP BY faculty');
PREPARE stmt FROM @sql;
EXECUTE stmt;

我当前的MySQL查询太复杂,偶尔会触发MySQL超时。那么,如何简化这个MySQL查询?

更新year列应该是动态的,并且即使我在未来几年中添加更多结果,查询也应该可以正常工作。

1 个答案:

答案 0 :(得分:1)

您可以使用以下查询获得按年份汇总的结果。

您需要为每种教职员工的颜色添加一个新列,但是鉴于这是一个已知的有限列表,应该不会有问题。

SELECT 
    MAX(year) AS year, 
    MAX(IF(faculty = 'Yellow', w_gender, NULL)) AS yellow,
    MAX(IF(faculty = 'Green', w_gender, NULL)) AS green,
    MAX(IF(faculty = 'Purple', w_gender, NULL)) AS purple
FROM results
GROUP BY year

这是一个简化的工作数据库小提琴:https://www.db-fiddle.com/f/uoX44nDLSji344iXCdmtfV/0