Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将MySQL连接行简化为列?_Mysql_Join - Fatal编程技术网

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

如何将MySQL连接行简化为列?,mysql,join,Mysql,Join,目前,我有一个班级主席成绩表。我正在尝试将行作为列连接。基本上,结果应该提供不同年份班长性别的概述 表,命名结果: 预期结果: +--------+------+------+ | group | 2016 | 2018 | +--------+------+------+ | yellow | B | G | | green | G | G | | purple | G | B | +--------+------+------+ 工作MySQL查询,

目前,我有一个班级主席成绩表。我正在尝试将行作为列连接。基本上,结果应该提供不同年份班长性别的概述

表,命名结果:

预期结果:

+--------+------+------+
| group  | 2016 | 2018 |
+--------+------+------+
| yellow | B    | G    |
| green  | G    | G    |
| purple | G    | B    |
+--------+------+------+
工作MySQL查询,修改自:

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


更新:年份列应该是动态的,即使我在未来几年添加了更多结果,查询也应该可以工作。

您可以使用以下查询按年份汇总结果

您需要为每种颜色添加一个新列,但考虑到这是一个已知的有限列表,这不应该是一个问题

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

这里有一个简化的工作数据库FIDLE:

可能是的副本这里没有太多的简化要做。要根据表的内容动态生成这些列(2016、2018),这种方法需要执行两条语句。注意组concat\u max\u len。为了提高性能,我会使第一个查询更复杂一些。。。而不是从结果来看,我会。。。从“按年度从结果组中选择年度”v rt gwt中,结果将缩减为年度的不同值,然后通过组集合运行该值。以年度为前导列的指数应该有助于按业绩分组。分组是否固定?如果是这样的话,那么创建“组”列和“年”行就容易多了。@spencer7593谢谢你的建议,我会试试看。
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;
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