#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
дескрипторы, которые уже -
псевдонимы таблиц облегчают запись и чтение запроса