Potrzebna pomoc przy zapytaniu SELECT

0

Witam, piszę aplikację do obsługi pewnych targów. I klient zażyczył sobie na koniec jeszcze jednego raportu. Udało mi się napisać zapytanie, które jednak nie do końca pokazuje to, co pokazać powinno. Nie mogę sobie dać z tym rady.

Chodzi o to. Zwiedzający są dzieleni na różne grupy: VIP, media, gość, itp.
Na targach odbędzie się ileś pokazów i chodzi o to, aby wyświetlić raport, który pokaże ile vipów, mediów itd. było obecnych na każdym z pokazów. Niby proste... Ale ;)

  1. Zwiedzający otrzymują przy wejściu kartę z numerem, lub karty.
  2. Jeden zwiedzający może mieć kilka kart
  3. Każda karta może mieć różne uprawnienia(np. wejście do VipRoomu, wejście na konkretny pokaz)

Baza wygląda następująco(przedstawiam tylko interesujące dane):

EVENTS(ID, name) - tabela z pokazami
CARDS(ID, cardNo) - tabela z kartami
ENTRIES(ID, cardID, eventID, entryDate) - tabela przechowuje dane mówiące o tym, kto wszedł na który pokaz o której godzinie. Ściślej - jaka karta "weszła"

GUEST_TYPES(ID, name) - tabela słownikowa przechowująca typy zwiedzających(VIP, media, gość, itd)
GUESTS(ID, name, guestType) - tabela przechowująca zarejestrowanych zwiedzających

GUESTS_CARDS(ID, guestID, cardID) - tabela realizująca relację wiele do wielu

Co zwraca moje zapytanie.
Ano, listę wszystkich pokazów, obok tylko te typy gości, które weszły, lub null i ilość. np:

Pokaz 1 | Media | 2
Pokaz 1 | VIP | 3
Pokaz 2 | null | 0

Zakładając, że są 3 typy gości: VIP, media i gość, chciałbym, aby to zapytanie zwróciło:

Pokaz 1 | Media | 2
Pokaz 1 | VIP | 3
Pokaz 1 | Gość | 0
Pokaz 2 | Media | 0
Pokaz 2 | VIP | 0
Pokaz 2 | Gość | 0

Próbowałem pobierać z tabeli guestTypes, a także próbowałem guestTypes łączyć za pomocą CROSS joina, ale nie przyniosło to wymaganych rezultatów.

Moje zapytanie wygląda następująco:

select ev.name, gt.name, count(en.ID) 
from events ev
left join entries en on en.eventID = ev.ID 
left join cards c on c.ID = en.cardID
left join guests_cards gc on gc.cardID = c.ID
left join guests g on g.ID = gc.guestID
left join guestTypes gt on gt.ID = g.guestType
group by ev.name, gt.name
order by ev.name

Nic lepszego nie mogę napisaćl.

0

select ev.name, gt.name, (select count(*) from ENTRIES en where warunek)
from events ev, guestTypes gt
order by ev.name

1
select e.Name as eventName, gt.Name as guestTypeName, ifnull(T.Count, 0)
from EVENTS e, GUEST_TYPES gt
left join (
  select en.eventID, g.guestType, ifnull(count(*),0) as Count
  from ENTRIES en
  inner join GUESTS_CARDS gc on en.cardID = gc.cardID
  inner join GUESTS g on gc.guestID = g.ID
  group by en.eventID, g.guestType
) as T on e.ID =T.eventID and gt.ID = T.guestType

no i sie spóźniłem

0

OK, trzeba tabelę guest_types dołączyć poprzez cross joina, a nie from :) Wtedy działa :) Dzięki!

1 użytkowników online, w tym zalogowanych: 0, gości: 1