Запрос не показывает 0 значений mysql
В своем запросе я перечисляю все продажи билетов в театр и продажи билетов в кино разных клиентов. Проблема, с которой я сталкиваюсь, заключается в том, что все продажи билетов равны нулю, поэтому те пользователи, которые не приобрели билет в театр или билет в кино, не появляются.
Вот картинка для визуального аспекта: таблица
Я считаю, что мне нужно создать профсоюз, чтобы вернуть пользователей, которые еще не купили билеты. Я просто не могу понять это.
Заранее спасибо.
Вот мой код до сих пор:
select customer.hippcode, customer.LastName, customer.Firstname, customer.Email,
count(ticketdetails.eventtype) as 'Theater Tickets',
0 as 'Movie Tickets'
from customer
inner join ticketdetails on ticketdetails.hippcode = customer.hippcode
where ticketdetails.hippcode is not null
and ticketdetails.eventType ='T'
Group by Customer.hippcode
union
select customer.hippcode, customer.LastName, customer.Firstname, customer.Email,
0 as 'Theater Tickets', count(ticketdetails.eventtype) as 'Movie Tickets'
from customer
inner join ticketdetails on ticketdetails.hippcode = customer.hippcode
where ticketdetails.hippcode is not null
and ticketdetails.eventType ='M'
Group by Customer.hippcode
order by `theater tickets` + `movie tickets` desc;
select
customer.hippcode, customer.LastName, customer.Firstname, customer.Email,
sum(case when ticketdetails.eventtype = 'T' then 1 else 0 end) as TheaterTickets,
sum(case when ticketdetails.eventtype = 'M' then 1 else 0 end) as MovieTickets
from customer
inner join ticketdetails on ticketdetails.hippcode = customer.hippcode
where ticketdetails.hippcode is not null
and ticketdetails.eventType in ('T', 'M')
Group by customer.hippcode, customer.LastName, customer.Firstname, customer.Email
Order by 'TheaterTickets' + 'MovieTickets' desc
2 ответа
Я думаю, что последний запрос - единственный, который вы хотите. left join
уместно, но вы должны быть осторожны с where
пункт:
select c.hippcode, c.LastName, c.Firstname, c.Email,
sum(td.eventtype) as TheaterTickets,
sum(td.eventtype) as MovieTickets
from customer c left join
ticketdetails td
on td.hippcode = c.hippcode and
td.eventType in ('T', 'M')
Group by c.hippcode, c.LastName, c.Firstname, c.Email
Order by count(t.hippcode) desc;
Заметки:
- Псевдонимы таблиц облегчают чтение и запись запроса.
- Условия на
ticketdetails
идти вon
пункт, а неwhere
пункт. - Состояние на
td.hippcode is not null
не нужно, потому чтоNULL
не будет совпадать вjoin
(примечание: вы можете проверить столбец клиента). case
это стандартный способ сделать условную сумму (и, следовательно, правильно). Тем не менее, MySQL предлагает гораздо более простой и интуитивно понятный синтаксис.- Ваш заказ по ничего не делал, потому что он добавлял две строки (следовательно, эквивалентно
order by 0
, Никогда не используйте одинарные кавычки для имен столбцов, и у вас не будет такой проблемы.
inner join
=> выводить строку только если вы получили запись на обе таблицы.
Я думаю, что вы должны использовать LEFT JOIN
где-то выбрать мастер-стол
http://dev.mysql.com/doc/refman/5.7/en/join.html и http://dev.mysql.com/doc/refman/5.7/en/left-join-optimization.html