Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: SELECT ostatnie 10 rekordów kazdego uzytkownika
Forum PHP.pl > Forum > Bazy danych > MySQL
geogis
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
prond
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;
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.