Jak użyć SQL AVG na kilku połączonych tabelach

Jak użyć SQL AVG na kilku połączonych tabelach
G8
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 85
0

Mam połączone 3 tabele. Wyświetlam tylko 2 kolumny i wiersze które mnie interesują, który mnie interesuje. Jak w tej sytuacji policzyć średnia tej jednej kolumny proce_in_pens?

Kopiuj

SELECT  DISTINCT title, price_in_pens FROM books
LEFT JOIN books_genres
ON books.book_id = books_genres.book_id
LEFT JOIN genres
ON genres.genre_id = books_genres.genre_id
WHERE genres.genre = 'children''s';

Normalnie zrobiłbym :

Kopiuj

SELECT AVG(price_in_pens) FROM books;

ale nie wiem jak to zrobić w przypadku łączoncyh tabel.

ZD
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2310
1
Glt87 napisał(a):

ale nie wiem jak to zrobić w przypadku łączoncyh tabel.

Ale ja nie wiem czego ty nie wiesz.
Wg mnie (tzn jeśli dobrze zgaduję) tak samo.

Kopiuj
SELECT AVG(price_in_pens) FROM books
LEFT JOIN books_genres
ON books.book_id = books_genres.book_id
LEFT JOIN genres
ON genres.genre_id = books_genres.genre_id
WHERE genres.genre = 'children''s';

Funkcje agregatowe działają na zbiorach danych, wiec wtedy nie pokazujemy danych szczegółowych (np tytulów)
JOIN skutkuje w filtrowaniu, ale prezentowany jest jeden jedyny wiers ze średnią

Już bardziej bruździ unique, na mojego czuja jednoczesne użycie unigue z agregatami da niestabilny wynik - w moim przykładzie olałem.

Inne, co mogę ZGADYWAĆ, to że chcesz jakiejś formy grupowania GROUP BY, i średnia w grupach

abrakadaber
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6610
2

@Glt87: jeśli masz kilka kolumn i funkcje agregujące tylko na kilku z nich to WSZYSTKIE pozostałe muszą się znaleźć w klauzuli grupującej GROUP BY (nie dotyczy MySQLa :p), w Twoim przykładzie powinno to wyglądać tak

Kopiuj
SELECT title, AVG(price_in_pens) 
FROM books
LEFT JOIN books_genres ON books.book_id = books_genres.book_id
LEFT JOIN genres ON genres.genre_id = books_genres.genre_id
WHERE genres.genre = 'children''s'
GROUP BY title;

Ilość tabel nie ma tu żadnego znaczenia. Taki zapis będzie oznaczał jednocześnie, że funkcja agregująca zostanie wykonana nie na wszystkich rekordach ale na ich grupach - w Twoim przypadku dostaniesz w wyniku tyle rekordów ile jest różnych title i każdy rekord będzie miał podaną średnią price_in_pens dla danego title

Jeszcze taka uwaga - jak robisz LEFT JOIN do jakiejś tabeli a następnie tą tabele używasz w warunku WHERE to tak naprawdę robisz INNER JOIN

PS. masz bardzo nieczytelnie sformatowane zapytania

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.