Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: problem z odpowiednim posortowaniem wyników
Forum PHP.pl > Forum > Bazy danych > MySQL
Karen
Witam,
piszę ponieważ nie wiem jak ugryźć ten temat.
Otóż mam bazę:

id|user|rma|przedmiot|timestamp

i do tego wpisy załóżmy:

1|usr1|1|item1|2011-01-01
2|usr3|1|item2|2011-01-01
3|usr2|2|item3|2011-01-02
4|usr1|3|item4|2011-02-01
5|usr2|4|item5|2011-02-02
6|usr3|5|item6|2011-02-03
7|usr1|6|item7|2011-02-03

Problem w tym, że potrzebuję otrzymać listę w takiej kolejności:

7|usr1|6|item7|2011-02-03
3|usr1|3|item3|2011-02-01
1|usr1|1|item1|2011-01-01
6|usr3|4|item6|2011-02-03
2|usr3|1|item2|2011-01-01
4|usr2|4|item4|2011-02-02
2|usr2|2|item2|2011-01-02

Teraz to lepiej zobrazuje smile.gif

Czyli pierw posortowane datą, ale też w pewien sposób "zgrupowane" polem user.
Czy da się to załatwić 1 zapytaniem? Niestety próby z jakimś subquery za bardzo obciążają bazę (kupa tekstu i 10000 rekordów).
Potrafiłby ktoś coś doradzić?

Z góry dzięki.
nospor
Nie "zgrupowane polem user" ale też posortowane polem user.

..... order by user desc, date desc
Karen
Hej, dzięki za szybką odpowiedź, ale sprawa jest bardziej skomplikowana.

Wynik ma być bardziej w stylu:
ORDER BY `timestamp` DESC
i dla każdego poszczególnego wyniku (wiersza) dodatkowo powinno być posortowane ORDER BY `user`

Czyli innymi słowy dostaję listę z datami, na górze ostatnia data -> sprawdzam nazwę użytkownika i jako podwynik otrzymuję jeszcze listę wszystkich jego przedmiotów ORDER BY `timestamp` lub `id` (na to samo wychodzi) DESC.

Edit:
Jeśli tylko posortuję "order by user desc, date desc" otrzymam stałą listę użytkowników, tzn ostatni będzie pierwszy itd. a to raczej powinno być uzależnione od kolejność przedmiotów posortowanych datą. Czyli niekoniecznie ostatni użytkownik w bazie będzie pierwszym.

Zadanie byłoby dość proste gdyby był podział na 2 tabele, ale niestety tak nie jest, a nie mam na to wpływu.

Mam nadzieję, że jest to czytelne smile.gif
Noidea
Musisz dołączyć do tabeli maksymalne daty każdego usera i to po nich najpierw sortować. Później już normalnie sortujesz to nazwie i czym tam chcesz.
  1. SELECT t1.*
  2. FROM tabela t1
  3. JOIN (
  4. SELECT user, MAX( timestamp ) AS max_timestamp
  5. FROM tabela
  6. GROUP BY user
  7. ) t2 ON ( t1.user = t2.user )
  8. ORDER BY t2.max_timestamp DESC, t1.user ASC, t1.timestamp DESC


Sprawdź jak wydajność. Jeśli masz indeks na polu user to powinno być ok
Karen
Wielkie dzięki, dokładnie o to chodziło. smile.gif
Wydajność dla moich potrzeb jest wystarczająca - 0,4 - 0,3sek
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.