Как я могу упростить строки соединения MySQL как столбцы? - PullRequest
0 голосов
/ 13 ноября 2018

В настоящее время у меня есть таблица результатов президента класса.Я пытаюсь объединить строки в виде столбцов.По сути, в результате должен быть представлен обзор пола президента класса в разные годы.

Таблица с именем 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 Объединить несколько строк в виде столбцов :

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 голосов
/ 14 ноября 2018

Вы можете получить результаты, агрегированные по годам, используя следующий запрос.

Вам нужно будет добавить новый столбец для каждого цвета факультета, но, учитывая, что это известный конечный список, который не должен бытьпроблема.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...