Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Sortowanie po średniej, Użycie funkcji AVG i dwie różne tabele
deejay4net
post
Post #1





Grupa: Zarejestrowani
Postów: 38
Pomógł: 0
Dołączył: 11.06.2007

Ostrzeżenie: (0%)
-----


Problem jest następujący mamy dwie tabele
pierwsza: arts gdzie mamy artykuły (id i rożne pola mniej ważne i kategoria)

druga
rate gdzie mamy oceny "id,uid,artid,rate"
uid użytkownik , id arta i ocena 1-10

Tera pobierając artykuły chciałbym posortować je względem tabeli rate (plus kategoria) a dokładnie średniej pola rate.
Wiem że należy użyć funkcji AVG do wyliczenia średniej ale dalej pojawia się problem.. gdy skonstruowałem zapytanie pobiera mi tylko jeden rekord (pewnie zła składnia)

  1. SELECT arts.*,rate.rate FROM `arts` arts LEFT JOIN `rate` rate ON rate.artid = arts.id WHERE arts.category ='{$category}' ORDER BY AVG(rate.rate) ASC LIMIT {$from} , {$to}


z góry thx za pomoc (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
thek
post
Post #2





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Czyli chcesz zrobić coś takiego:
- Wybrać artykuły z określonej kategorii,
- Połączyć wszystkie artykuły z ocenami doń przypisanymi,
- Tak uzyskane krotki artykuł-ocena podzielić na paczki dotyczące określonego artykułu i wyliczyć z nich średnią,
- Posortować po owej średniej.

Popatrz jak to jest zapisane i jakimi słowami a zapewne Ci to podpowie co robić (IMG:style_emoticons/default/winksmiley.jpg) Najważniejsze to użyć odpowiedniej rzeczy w myślniku trzecim. Pomyśl jak uzyskać to "podzielenie na paczki" po artykule. Bo tutaj siedzi meritum Twojego problemu. Myślę, że jesteś na tyle inteligentny, że łatwo się domyślisz, czego brakuje w przytoczonym przez Ciebie zapytaniu. Bo tylko jednej rzeczy Ci brakuje. Na razie bowiem liczy Ci AVG z wszystkich rekordów w bazie i stąd jeden rekord w wyniku. A powinno liczyć średnią dla każdego artykuły w kategorii, który ma jakąś ocenę wystawioną.
Go to the top of the page
+Quote Post
deejay4net
post
Post #3





Grupa: Zarejestrowani
Postów: 38
Pomógł: 0
Dołączył: 11.06.2007

Ostrzeżenie: (0%)
-----


Tak myślałem że group by się przyda ;D

oto rozwiązanie skrócone gdyby ktoś inny szukał

  1. SELECT arts.*, AVG(rate.rate) artsrate FROM arts LEFT JOIN rate ON rate.artid = arts.id WHERE arts.category=1 GROUP BY arts.id ORDER BY artsrate DESC


Pominąłem już dzielenie (LIMIT)
dzięki thek za natchnienie (IMG:style_emoticons/default/smile.gif)

Ten post edytował deejay4net 27.10.2009, 12:06:30
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 3.10.2025 - 03:53