Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> problem z odpowiednim posortowaniem wyników
Karen
post
Post #1





Grupa: Zarejestrowani
Postów: 39
Pomógł: 1
Dołączył: 23.10.2006

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


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.

Ten post edytował Karen 14.07.2011, 13:58:55
Go to the top of the page
+Quote Post
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Nie "zgrupowane polem user" ale też posortowane polem user.

..... order by user desc, date desc


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Karen
post
Post #3





Grupa: Zarejestrowani
Postów: 39
Pomógł: 1
Dołączył: 23.10.2006

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


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

Ten post edytował Karen 14.07.2011, 13:22:53
Go to the top of the page
+Quote Post
Noidea
post
Post #4





Grupa: Zarejestrowani
Postów: 226
Pomógł: 61
Dołączył: 20.08.2010

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


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


--------------------
Go to the top of the page
+Quote Post
Karen
post
Post #5





Grupa: Zarejestrowani
Postów: 39
Pomógł: 1
Dołączył: 23.10.2006

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


Wielkie dzięki, dokładnie o to chodziło. smile.gif
Wydajność dla moich potrzeb jest wystarczająca - 0,4 - 0,3sek
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 20.08.2025 - 00:03