MySQL - объединение и условный выбор столбцов - PullRequest
0 голосов
/ 04 апреля 2020

Не знаю, как точно назвать проблему. Поэтому мои примеры таблиц:

Люди:

id_people | peopleName |
------------------------
1         | John       |
2         | Jane       |
3         | Frank      |
4         | Emma       |

Курсы:

id | id_course | id_people | date       |
-----------------------------------------
1  | 1         | 1         | 2011-02-14 |
2  | 2         | 1         | 2013-05-01 |
3  | 3         | 1         | 2015-08-25 |
4  | 1         | 2         | 2012-01-05 |
5  | 1         | 4         | 2017-10-10 |

Теперь я хочу создать таблицу, в которой у меня по одной строке на человека и на каждого Конечно, столбец с датой вроде:

id_people | peopleName | Course1    | Course2    | Course3    |
---------------------------------------------------------------
1         | John       | 2011-02-14 | 2013-05-01 | 2015-08-25 |
2         | Jane       | 2012-01-05 |            |            |
3         | Frank      |            |            |            |
4         | Emma       | 2017-10-10 |            |            |

Я попытался следующий запрос:

SELECT *,
 max(case when courses.id_course = 1 then cource.date end) as Course1,
 max(case when courses.id_course = 2 then cource.date end) as Course2,
 max(case when courses.id_course = 3 then cource.date end) as Course3  
FROM people
JOIN courses ON people.id_people = courses.id_people
GROUP BY people.id_people

Но я получил ошибку # 1055 ([..] это несовместимо с sql_mode = only_full_group_by ). Таким образом, это заставляет меня добавить столбец course.id, course.id_course и course.date в группу с помощью statemant. Это приводит к ряду на человека и курс. Как я могу получить желаемую итоговую таблицу с отметкой sql? У меня нет права изменять переменную sql_mode.

Ответы [ 2 ]

1 голос
/ 04 апреля 2020

Так что это заставляет меня добавлять столбцы course.id, course.id_course и course.date в группу с помощью statemant ...

Нет, это не так. Вам нужно только изменить объединение на LEFT JOIN и group by people.id_people, people.peopleName, и вы получите желаемые результаты:

SELECT people.id_people, people.peopleName,
 max(case when courses.id_course = 1 then courses.date end) as Course1,
 max(case when courses.id_course = 2 then courses.date end) as Course2,
 max(case when courses.id_course = 3 then courses.date end) as Course3  
FROM people
LEFT JOIN courses ON people.id_people = courses.id_people
GROUP BY people.id_people, people.peopleName

См. demo . Результаты:

| id_people | peopleName | Course1     | Course2     | Course3     |
| --------- | ---------- | ----------- | ----------- | ----------- |
| 1         | John       | 2011-02-14  | 2013-05-01  | 2015-08-25  |
| 2         | Jane       | 2012-01-05  |             |             |
| 3         | Frank      |             |             |             |
| 4         | Emma       | 2017-10-10  |             |             |
1 голос
/ 04 апреля 2020

Вы не определили id_people как primary key или как минимум unique. Вероятно, вам следует это сделать.

Тем временем вы можете сначала агрегировать, а затем join:

SELECT *
FROM people p JOIN
     (SELECT c.id_people
             max(case when c.id_course = 1 then c.date end) as Course1,
             max(case when c.id_course = 2 then c.date end) as Course2,
             max(case when c.id_course = 3 then c.date end) as Course3  
      FROM courses c
      GROUP BY c.id_people
     ) c
     USING (id_people);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...