Grupowanie i wyświetlanie dodatkowych kolumn

Grupowanie i wyświetlanie dodatkowych kolumn
  • Rejestracja: dni
  • Ostatnio: dni
0

Witam
Mam problem z utworzeniem zapytania do tabel by jako wynik dostać wszystkie rekordy z pierwszej tabeli z dodatkową kolumną która będzie zawierać liczbę rekordów z innej tabeli...

Przykład

  1. Mam tabele Aktorzy i Filmy
  2. Chcę zrobić by wyświetliło aktorów wraz z liczbą filmów w których wystąpili

Stworzyłem takie zapytanie (kolumn w takAktorzy będzie docelowo więcej):

Kopiuj
 
SELECT     tabAktorzy.ID, tabAktorzy.Name, COUNT(*) AS LiczbaFilmow
FROM         tabAktorzy INNER JOIN
                      laczFilmAkt ON tabAktorzy.ID = laczFilmAkt.IDAktora
GROUP BY tabAktorzy.LiczbaFilmow

Jednakże po jego wykonaniu wyskakuje bład:

In aggregate and grouping expressions, the SELECT clause can contain only aggregates and grouping expressions.

Wiem o co w nim chodzi (o usunięcie kolumny Name z SELECT), ale same ID i liczba plików nie zadawala mnie

Sarrus
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2512
0

Ale problem jest w tym, że kilku aktorów może mieć taką samą liczbę filmów i wtedy nie możesz podać nazwiska aktora, bo jest dwóch, trzech i więcej. Powinieneś raczej grupować po nazwisku lub id a nie po liczbie filmów

  • Rejestracja: dni
  • Ostatnio: dni
0

Dzięki bardzo, rozwiązałeś przyszły problem ;]
Ale dalej nie wiem jak zrobić by były kolumny (imię, nazwisko, adres itd) oraz dodatkowo liczba filmów.
Chyba że stworze dodatkową kolumnę w tabeli aktor i za każdym razem będę ją aktualizował jak dojdzie jakiś film z aktorem...

Sarrus
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2512
0
Początkujący napisał(a)

Dzięki bardzo, rozwiązałeś przyszły problem ;]
Ale dalej nie wiem jak zrobić by były kolumny (imię, nazwisko, adres itd) oraz dodatkowo liczba filmów.
Chyba że stworze dodatkową kolumnę w tabeli aktor i za każdym razem będę ją aktualizował jak dojdzie jakiś film z aktorem...

A dlaczego przyszły?

Kopiuj
SELECT     tabAktorzy.ID, tabAktorzy.Name, tabAktorzy.LastName, tabAktorzy.Address, COUNT(*) AS LiczbaFilmow
FROM         tabAktorzy INNER JOIN
                      laczFilmAkt ON tabAktorzy.ID = laczFilmAkt.IDAktora
GROUP BY tabAktorzy.ID,tabAktorzy.Name, tabAktorzy.LastName, tabAktorzy.Address

EDIT
Poprawione na faktycznie działające, ale przekombinowane. Sposób massther'a jest dobry, a to co napisałem ma prawo działać tylko w tej konkretnej sytuacji

massther
  • Rejestracja: dni
  • Ostatnio: dni
1

Może garść teorii, jak masz grupowanie, to w select możesz mieć tylko kolumny po których grupujesz oraz wynik funkcji agregujących.

W tym przypadku najpierw zliczenie liczby filmów, a później złączenie wg mnie jest lepszym pomysłem.

Kopiuj
select a.*, COALESCE(m.numOfMovies, 0) from Aktorzy a
left join (select actorId, count(*) as numOfMovies from filmy group by actorId) as m on a.actorId = m.acorId
  • Rejestracja: dni
  • Ostatnio: dni
0

Wielkie dzięki massther

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.