Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL]sortowanie po 2kolumnach
fr33d0m
post
Post #1





Grupa: Zarejestrowani
Postów: 132
Pomógł: 4
Dołączył: 22.10.2010

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


Mam taką tabelę:
  1. id_ogl3 | czas3 | waznosc3
  2. 11 | 2012-07-05 23:59:40 | 7
  3. 12 | 2012-07-06 12:38:34 | 7
  4. 13 | 2012-07-06 21:48:36 | 7
  5. 14 | 2012-07-06 21:54:00 | 7
  6. 19 | 2012-07-14 01:38:27 | 7
  7. 20 | 2012-07-14 10:55:25 | 7
  8. 17 | 2012-07-28 01:38:11 | 21
  9. 15 | 2012-08-03 22:03:06 | 28
  10. 18 | 2012-08-04 01:38:21 | 28

Chcę wyniki posortować, aby na przodzie wyników: `czas3` był aktualny, ale wyświetlał się, względem `waznosc3` według najmniejszej ilości - kolejno: 7/21/28

Wydaję się, banalnie proste prawda? ano nie do końca;/ bo sortowanie po dwóch kolumnach nie działa mimo, że powinno;/
Używam takiego zapytania:
  1. SELECT `id_ogl3` , `czas3` , `waznosc3`
  2. FROM `oglosz3nia3`
  3. ORDER BY czas3 DESC , waznosc3 ASC
  4. LIMIT 0 , 30

Daje ono wyniki w połowie poprawne, bo wyświetla aktualny czas - ale wyświetla `waznosc3` w kolejnosci: 28/21/7 (powinno 7/21/28).
Zmiana sortowania `waznosc3` na DESC, nic nie zmienia - w ogóle SQL nie bierze tego pod uwagę!;/
Męczę się z tym od wczoraj i brak mi pomysłów... co robię źle?

Ps. kolumna `czas3` to timestamp - nie wiem czy to ma znaczenie.

Ten post edytował fr33d0m 7.07.2012, 14:05:22
Go to the top of the page
+Quote Post
djgarsi
post
Post #2





Grupa: Zarejestrowani
Postów: 459
Pomógł: 26
Dołączył: 1.06.2009

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


Czy napewno nazwa tabeli jest "oglosz3nia3" a nie "ogloszenia" ?
Go to the top of the page
+Quote Post
SmokAnalog
post
Post #3





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

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


Zmiana waznosc3 ASC na waznosc3 DESC nic nie zmienia? Chyba coś robisz nie tak...

Jaki typ ma pole waznosc3?
Go to the top of the page
+Quote Post
fr33d0m
post
Post #4





Grupa: Zarejestrowani
Postów: 132
Pomógł: 4
Dołączył: 22.10.2010

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


`czas3`timestamp
`waznosc3` tinyint(8) UNSIGNED
tabela w 100% nazwana poprawnie i nie robi problemów przy innych zapytaniach.
Prawda, że dziwne? ;/
Go to the top of the page
+Quote Post
redeemer
post
Post #5





Grupa: Zarejestrowani
Postów: 915
Pomógł: 210
Dołączył: 8.09.2009
Skąd: Tomaszów Lubelski/Wrocław

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


Sortowanie po wielu kolumnach działa tak: najpierw sortuje po pierwszej kolumnie, a gdy wartości są takie same, sortuje po drugiej. W Twoim przypadku masz inne czasy w rekordach, więc sortowanie odbywa tylko po pierwszej kolumnie w zapytaniu czyli po czasie. To że wyszło Ci "28/21/7" to tylko zbieg okoliczości, równie dobrze możesz zignorować drugi warunek w order, zostawić samo "ORDER BY czas3 DESC" i otrzymasz ten sam wynik.

Proponowałbym zamienić miejscami warunki w order.

Ten post edytował redeemer 7.07.2012, 11:16:56
Go to the top of the page
+Quote Post
pmir13
post
Post #6





Grupa: Zarejestrowani
Postów: 282
Pomógł: 89
Dołączył: 12.04.2011

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


Sortowanie, które używasz:

ORDER BY czas3 DESC , waznosc3 ASC

oznacza, że należy wypisać rekordy w kolejności malejącej według pola czas3, a spośród rekordów o dokładnie tym samym czasie najpierw wypisać te, które mają mniejszą ważność.

Ponieważ w tabeli wszystkie czasy są różne drugi parametr sortowania nie jest brany pod uwagę.
Go to the top of the page
+Quote Post
fr33d0m
post
Post #7





Grupa: Zarejestrowani
Postów: 132
Pomógł: 4
Dołączył: 22.10.2010

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


Zmiana kolejności ORDER BY waznosc3 ASC, czas3 DESC daje rezultat sortowania wyłącznie po `waznosc3` - więc wygląda na to, że pmir13 ma rację i nie da się, tego zrobić. Dziękuję za wyjaśnienie.

Obecnie myślę, aby zrezygnować z timestamp i zastąpić INT'em, gdzie data była by wprowadzana w taki sposób: 20120707 - to w teorii powinno rozwiązać problem z sortowaniem. Tylko znowu będę musiał zmienić sporą część kodu PHP, w kilku plikach...

Ma ktoś inną idee na rozwiązanie problemu?
Go to the top of the page
+Quote Post
redeemer
post
Post #8





Grupa: Zarejestrowani
Postów: 915
Pomógł: 210
Dołączył: 8.09.2009
Skąd: Tomaszów Lubelski/Wrocław

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


Oczywiście że zamiana warunków nie rozwiąże od razu problemu, jednak chciałem Cię jakoś nakierować (IMG:style_emoticons/default/smile.gif) Na szybko:
  1. SELECT * FROM (SELECT * FROM tabela ORDER BY waznosc ASC, czas DESC) AS alias ORDER BY alias.czas DESC
Go to the top of the page
+Quote Post
fr33d0m
post
Post #9





Grupa: Zarejestrowani
Postów: 132
Pomógł: 4
Dołączył: 22.10.2010

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


Hmm... (IMG:style_emoticons/default/smile.gif)
  1. SELECT czas3, waznosc3
  2. FROM (
  3. SELECT czas3, waznosc3
  4. FROM oglosz3nia3
  5. ORDER BY waznosc3 ASC
  6. ) AS alias
  7. ORDER BY alias.czas3 DESC


Po wyglądzie można domyślić się, że najpierw sortuje po `waznosc3` i dopiero później po `czas3` - jednak w praktyce pokazuje to samo, co:
  1. SELECT `id_ogl3` , `czas3` , `waznosc3`
  2. FROM `oglosz3nia3`
  3. ORDER BY czas3 DESC
  4. LIMIT 0 , 30

`czas3` od największego(ok) i `waznosc3` w kolejnosci 28/21/7 (potrzebuję 7/21/28)

Więc wygląda na to, że dalej jest coś nie tak... Na pewno takie zgłębienie zapytania jest lepsze od zastosowania daty w INT'cie tak jak to wyżej przedstawiłem. Będę się bawił w testy jeszcze, może coś wyjdzie...

edit
z tego zapytania nic nie wyjdzie, bo przy końcówce zapytania, alias jest sortowany pod DESC, mimo, że wcześniej był sortowany pod ASC (alias.czas3 DESC) - więc w rezultacie zawsze będzie 28/21/7.

Pytanie brzmi, jak najpierw posortować `waznosc3` pod ASC, a później wszystkie posortowane dane pod `waznosc3` posortować raz jeszcze, ale pod `czas3` DESC. ?
I tu z samego pytania wynika, że się NIE DA bo sortowanie dwu-krotne, zawsze będzie wyglądało według ostatniego posortowania. Szkoda...

Ten post edytował fr33d0m 7.07.2012, 12:31:11
Go to the top of the page
+Quote Post
redeemer
post
Post #10





Grupa: Zarejestrowani
Postów: 915
Pomógł: 210
Dołączył: 8.09.2009
Skąd: Tomaszów Lubelski/Wrocław

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


Przepraszam, gorąc uderzył mi do mózgu i to zapytanie które napisałem, jest złe. Może to pomoże:
  1. SELECT * FROM (SELECT * FROM oglosz3nia3 ORDER BY czas3 DESC) AS alias ORDER BY alias.waznosc3 ASC


Ten post edytował redeemer 7.07.2012, 12:42:33
Go to the top of the page
+Quote Post
fr33d0m
post
Post #11





Grupa: Zarejestrowani
Postów: 132
Pomógł: 4
Dołączył: 22.10.2010

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


@redeemer, dzięki za pomoc, ale nie da się tego zrobić. W Twoim przykładzie alias(`czas3`) sortujesz dwu-krotnie: raz pod DESC, później pod ASC.

Rozwiązałem problem w taki sposób, że zmieniłem timestamp na date.

Jeszcze raz, wielkie dzięki za pomoc. (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
redeemer
post
Post #12





Grupa: Zarejestrowani
Postów: 915
Pomógł: 210
Dołączył: 8.09.2009
Skąd: Tomaszów Lubelski/Wrocław

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


Cytat
W Twoim przykładzie alias(`czas3`) sortujesz dwu-krotnie: raz pod DESC, później pod ASC.
W moim ostatnim przykładzie najpierw wewnętrzne zapytanie jest sortowane po czasie (DESC), a poźniej wynik tego zapytania jest sortowany według ważności (ASC). Zrobiłem nawet testową tabelę i wprowadziłem do niej dane z postu #1 i zapytanie zwraca wynik oczekiwany.
Go to the top of the page
+Quote Post
fr33d0m
post
Post #13





Grupa: Zarejestrowani
Postów: 132
Pomógł: 4
Dołączył: 22.10.2010

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


Hm... wcześniej dałbym sobie rękę uciąć, że wyskakiwały inne wyniki, nawet teraz gdy wprowadziłem do SQL takie zapytanie raz jeszcze, aby ponownie sprawdzić:
  1. SELECT czas3, waznosc3
  2. FROM (
  3. SELECT czas3, waznosc3
  4. FROM oglosz3nia3
  5. ORDER BY czas3 DESC
  6. ) AS alias
  7. ORDER BY alias.waznosc3 ASC

To wyskoczyły źle posortowane. Robiłem już screena na dowód, że nie działa, kiedy coś mnie tknęło i odpaliłem raz jeszcze to samo zapytanie... (IMG:style_emoticons/default/ohmy.gif)
Faktycznie posortowały się tak jak powinny. (IMG:style_emoticons/default/yahoo.gif)
Tylko czemu posortowały się poprawnie dopiero za kolejnym wywołaniem zapytania? czy to możliwe? wcześniej też próbował kilka razy, na kilka różnych sposobów i efekt był w postaci złego sortu... (IMG:style_emoticons/default/co_jest.gif)
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: 26.09.2025 - 17:48