Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL]sortowanie po 2kolumnach
Forum PHP.pl > Forum > Przedszkole
fr33d0m
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.
djgarsi
Czy napewno nazwa tabeli jest "oglosz3nia3" a nie "ogloszenia" ?
SmokAnalog
Zmiana waznosc3 ASC na waznosc3 DESC nic nie zmienia? Chyba coś robisz nie tak...

Jaki typ ma pole waznosc3?
fr33d0m
`czas3`timestamp
`waznosc3` tinyint(8) UNSIGNED
tabela w 100% nazwana poprawnie i nie robi problemów przy innych zapytaniach.
Prawda, że dziwne? ;/
redeemer
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.
pmir13
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ę.
fr33d0m
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?
redeemer
Oczywiście że zamiana warunków nie rozwiąże od razu problemu, jednak chciałem Cię jakoś nakierować smile.gif Na szybko:
  1. SELECT * FROM (SELECT * FROM tabela ORDER BY waznosc ASC, czas DESC) AS alias ORDER BY alias.czas DESC
fr33d0m
Hmm... 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...
redeemer
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
fr33d0m
@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. smile.gif
redeemer
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.
fr33d0m
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... ohmy.gif
Faktycznie posortowały się tak jak powinny. 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... co_jest.gif
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.