Объединение нескольких результатов запроса в один с использованием case

#mysql #sql #pivot #left-join

#mysql #sql #сводная #левое соединение

Вопрос:

У меня есть пользовательская таблица, которая содержит информацию о пользователях с полями user_id, fullname, age, username, password , а другая — tests-table с полями id, user_id, test_type

Когда я пишу приведенный ниже запрос

 select users.user_id, fullname,
(CASE WHEN test_table.user_id=users.id and test_table.type = 'objectives'   THEN 'yes' ELSE 'no' END) AS written_objectives, 
(CASE WHEN test_table.user_id=users.id and test_table.type = 'theory'   THEN 'yes' ELSE 'no' END) AS written_theory, 

from users

LEFT JOIN test_table ON users.id = test_table.user_id
WHERE users.user_id = 1 
  

Я получаю такие результаты

 user_id|fullname| test_type | written_objectives| written_theory
1      | Ben.   | objectivs |       yes         | no
1      | Ben.   | theory    |       no          | yes
  

Но я хочу, чтобы результаты были такими

 user_id|fullname| test_type | written_objectives| written_theory
1      | Ben.   | objectivs |       yes         | yes
  

Из приведенного выше сценария пользователь с id помощью of 1 представил как цели, так и теорию.

Ответ №1:

Вы можете выполнить условную агрегацию:

 select u.user_id, u.fullname,
    max(tt.type = 'objectives') written_objectives, 
    max(tt.type = 'theory'    ) written_theory
from users u
left join test_table tt on u.id = tt.user_id
where u.user_id = 1 
group by u.user_id
  

Это генерирует 0 / 1 значения, а не 'yes' / 'no' — что я нахожу более выразительным. Но если вам действительно нужны эти строки, то:

 select u.user_id, u.fullname,
    case when max(tt.type = 'objectives') then 'yes' else 'no' end written_objectives, 
    case when max(tt.type = 'theory'    ) then 'yes' else 'no' end written_theory
from users u
left join test_table tt on u.id = tt.user_id
where u.user_id = 1 
group by u.user_id
  

Примечания:

  • нет необходимости повторять условие соединения в условном выражении — left join дескрипторы, которые уже

  • псевдонимы таблиц облегчают запись и чтение запроса