Показать множественный выбор с 3 столбцами в MYSQL и значениями NULL
У меня есть эти 2 таблицы:
зрачки:
id_pupil
name
surname
email
user
pass
level
class
инциденты:
id_incidents
date
time
type_incident(miss, delay or attitude)
comments
id_pupil
id_user
subject
id_trimester
И я хотел бы получить это:
Я пишу это:
select pupils.id_pupil, name, surname, count(type_incident) as misses
from pupils left join incidents using (id_pupil)
where type_incident='miss' and level=1 and class='B' and id_trimester=1
group by id_pupil
и я получаю столбец с промахами каждого ученика. Тем не менее, я не получаю нулевые значения, потому что я хочу также получить учеников с 0 промахами.
То же самое с задержками и отношением:
select pupils.id_pupil, name, surname, count(type_incident) as misses
from pupils left join incidents using (id_pupil)
where type_incident='delay' and level=1 and class='B' and id_trimester=1
group by id_pupil
select pupils.id_pupil, name, surname, count(type_incident) as misses
from pupils left join incidents using (id_pupil)
where type_incident='attitude' and level=1 and class='B' and id_trimester=1
group by id_pupil
И я хочу получить все в одной таблице, как описано на картинке.
Спасибо!
3 ответа
Поставить вам условия в sum()
, Суммирует, сколько раз ваше состояние было верным (1
)
select pupils.id_pupil, name, surname,
sum(type_incident='miss' and level=1 and class='B' and id_trimester=1) as misses,
sum(type_incident='delay' and level=1 and class='B' and id_trimester=1) as delays,
sum(type_incident='attitude' and level=1 and class='B' and id_trimester=1) as attitudes
from pupils
left join incidents using (id_pupil)
group by id_pupil, name, surname
SQLFiddle demo
Я думаю, что ответ Юргена был бы лучше, чем мой, так как код более читабелен, но так как я уже печатал свой, я продолжу и опубликую другой способ достижения того же результата: два моих исходных предложения были добавить name
а также surname
к вашему заявлению GROUP BY; Кроме того, переместить условие and id_trimester=1
от ГДЕ до вашего ЛЕВОГО СОЕДИНЕНИЯ, так что-то вроде этого:
select p.id_pupil, name, surname, count(i.type_incident) as misses, count(i2.type_incident) as delays, count(i3.type_incident) as attitudes
from pupils p
left join incidents i on i.id_pupil = p.id and i.type_incident='miss' and i.id_trimester=1
left join incidents i2 on i2.id_pupil = p.id and i2.type_incident='delay' and i2.id_trimester=1
left join incidents i3 on i3.id_pupil = p.id and i3.type_incident='attitude' and i3.id_trimester=1
where p.level=1 and p.class='B'
group by p.id_pupil, name, surname
SELECT CONCAT(p.name, ' ', p.surname) AS Pupil, t1.misses, t2.delays, t3.attitude
FROM pupils AS p
LEFT JOIN (SELECT COUNT(*) AS misses FROM id_incidents WHERE type_incident = 'miss' and level=1 and class='B' and id_trimester=1) AS t1 ON (t1.id_user = p.id_pupil)
LEFT JOIN (SELECT COUNT(*) AS delays FROM id_incidents WHERE type_incident = 'delay' and level=1 and class='B' and id_trimester=1) AS t2 ON (t2.id_user = p.id_pupil)
LEFT JOIN (SELECT COUNT(*) AS attitude FROM id_incidents WHERE type_incident = 'attitude' and level=1 and class='B' and id_trimester=1) AS t3 ON (t3.id_user = p.id_pupil)