Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Sortowanie bez powtórzeń
Forum PHP.pl > Forum > Bazy danych > MySQL
Athlan
Witam.

Mam tabelę (w przybliżeniu):
  • comment_id
  • comment_item
  • comment_date

Chciałbym wyciągnąć ostatnich 10 rekordów sortując po comment_date DESC, ale żeby comment_item się nie powtórzyło. Niestety, GROUP BY comment_item psuje całe sortowanie (bierze pierwszą napotkaną datę).

Wymyśliłem takie coś, ale nie jestem pewien złożoności obliczeniowej, która jest pewnie ogromna:
  1. SELECT c.*, (SELECT d.comment_date FROM cms_comments AS d WHERE d.comment_item = c.comment_item ORDER BY d.comment_date DESC LIMIT 0,1)AS comment_date_last
  2. FROM cms_comments AS c
  3. GROUP BY c.comment_item
  4. ORDER BY comment_date_last DESC
  5. LIMIT 0, 10

Katuję bazę danych? SELECT DISTINCT rozwiązałby mój problem? Jakbym musiał wówczas ułożyć optymalne zapytanie?

Ponoć DISTINCT wydajniejsze od ewentualnego GROUP BY
Cytat
When combining LIMIT row_count with DISTINCT, MySQL stops as soon as it finds row_count unique rows.


Z góry dzięki za odpowiedzi,
Athlan.
wookieb
Nie jestem pewien czy zadziała ale można spróbować.
  1. SELECT c.*, max(comment_date) AS comment_date_last
  2. FROM cms_comments AS c
  3. GROUP BY c.comment_item
  4. ORDER BY comment_date_last DESC
  5. LIMIT 0, 10


Nie zajedziesz bazy jak będziesz mieć index na polach (comment_item, comment_date) w takiej kombinacji.
Athlan
Gitara gra. MAX() działa dzięki GROUP - otrzymuję te same wyniki, co moim sposobem, który jest trywialny i rozłożony na czynniki pierwsze. Taki indeks już mam, więc jest w użyciu po EXPLAIN'ie.

Ale nie jestem pewien, czy się to czymś różni. W zasadzie rozpisałem MAX() na części pierwsze, stąd wynik powinien być taki sam. Ufam jednak mechanizmom bazy danych.

Propsy : )
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.