Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> SELECT ostatnie 10 rekordów kazdego uzytkownika
geogis
post
Post #1





Grupa: Zarejestrowani
Postów: 30
Pomógł: 0
Dołączył: 12.03.2005

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


Witam,

Mam system oceniania zdjęć na stronie, który buduje mi potem TOP 30.

TOP 30 mogę przeglądać wg płci osób głosujących. Czyli mozemy zobaczyc jak głosowały Panie a jak Panowie.

Na tę chwilę działa mi to bez zarzutów. Przykład. Wyciągam z bazy srednią ocen Panów. Zdjęcia muszą mieć już przynajmniej 10 głosów. Sortuje od tych które mają najwyższa średnią i ograniczam ilosc zdjęc do 30:

  1. SELECT t.photo_id, t.user_id, t.sex, FORMAT(AVG(t.rate),2) AS rate, COUNT(t.photo_id) AS num
  2. FROM (SELECT r.photo_id AS photo_id, p.user_id AS user_id, per.sex AS sex, r.rate AS rate, p.file_name AS file_name FROM photo_rates r, user_photos p, personal_details per WHERE r.photo_id=p.id AND per.user_id=r.user_id AND per.sex='m') AS t
  3. GROUP BY t.photo_id
  4. HAVING num>10
  5. ORDER BY rate DESC
  6. LIMIT 30


Teraz mam to przerobić. Chodzi o to że zmieniam warunek.... dalej interesują mnie zdjęcia które mają przynajmniej 10 ocen, ale dodatkowo chodzi o to żeby średnia była wyliczona na podstawie tylko 10 ostatnich ocen....

Czyli np. mam zdjecie które ma 15 ocen wiec sie ono kwalifikuje, ale średnia ocena wyliczana jest tylko i wyłacznie na podstawie ostatnich 10 ocen....

Mam nadzieje ze jest to zrozumiałe.

Niestety nie wiem jak to ugryźć. Oczywiście mogłbym sie bawić w PHP i oprzec to o jakies tablice i pętle... ale chciałbym to zrobić ładnie w zapytaniu mysql.

Ktoś chętny żeby pomóc?

Pozdrawiam,
geogis
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 1)
prond
post
Post #2





Grupa: Zarejestrowani
Postów: 254
Pomógł: 10
Dołączył: 8.11.2006
Skąd: Warszawa

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


Trafiłeś na gruby problem. Nazywa się to funkcja rankingująca, której w MySQL po prostu nie ma.

Obejście jest następujące (to jest przykład na mojej tabelce, ale chyba dasz radę zastosować metodę do swojego problemu).
  1. SET @intRownum := 0;
  2. SET @intLastTicketId := 0;
  3. SELECT
  4. ticket_id,
  5. received
  6. FROM
  7. (
  8. SELECT
  9. ticket_id,
  10. received,
  11. CASE
  12. WHEN @intLastTicketId <> ticket_id
  13. THEN @intRownum := 1
  14. ELSE @intRownum := @intRownum + 1
  15. END AS rank,
  16. @intLastTicketId := ticket_id
  17. FROM
  18. `ebok_ticket_messages`
  19. WHERE
  20. message_type_id = 3
  21. ORDER BY
  22. ticket_id,
  23. received
  24. ) AS t
  25. WHERE
  26. t.rank = 1;
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: 24.08.2025 - 12:01