В моем запросе я перечисляю все продажи билетов в театр и продажи билетов в кино разных клиентов. Проблема, с которой я сталкиваюсь, заключается в том, что все продажи билетов равны нулю, поэтому те пользователи, которые не приобрели билет в театр или в кино, не появляются.
Вот картинка для визуального аспекта: Таблица
Я считаю, что мне нужно создать профсоюз, чтобы вернуть пользователей, которые еще не купили билеты. Я просто не могу понять это.
Заранее спасибо.
Вот мой код до сих пор:
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
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
Я думаю, что последний запрос — единственный, который вы хотите. 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
, Не используйте одинарные кавычки Когда-либо для имен столбцов, и у вас не будет такой проблемы.