Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL]sortowanie po 2kolumnach
fr33d0m
post 7.07.2012, 10:32:09
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


--------------------
UWAGA! Stwierdzono naruszenie paragrafu §33 ustawy ACTA. Podpis użytkownika został usunięty.
Go to the top of the page
+Quote Post
djgarsi
post 7.07.2012, 10:51:47
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 7.07.2012, 10:52:42
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 7.07.2012, 10:55:02
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? ;/


--------------------
UWAGA! Stwierdzono naruszenie paragrafu §33 ustawy ACTA. Podpis użytkownika został usunięty.
Go to the top of the page
+Quote Post
redeemer
post 7.07.2012, 11:15:17
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 7.07.2012, 11:20:21
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 7.07.2012, 11:35:38
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?


--------------------
UWAGA! Stwierdzono naruszenie paragrafu §33 ustawy ACTA. Podpis użytkownika został usunięty.
Go to the top of the page
+Quote Post
redeemer
post 7.07.2012, 11:58:42
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ć 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 7.07.2012, 12:20:07
Post #9





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

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


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...

Ten post edytował fr33d0m 7.07.2012, 12:31:11


--------------------
UWAGA! Stwierdzono naruszenie paragrafu §33 ustawy ACTA. Podpis użytkownika został usunięty.
Go to the top of the page
+Quote Post
redeemer
post 7.07.2012, 12:35:10
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 7.07.2012, 12:59:42
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. smile.gif


--------------------
UWAGA! Stwierdzono naruszenie paragrafu §33 ustawy ACTA. Podpis użytkownika został usunięty.
Go to the top of the page
+Quote Post
redeemer
post 7.07.2012, 13:42:22
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 7.07.2012, 14:04:54
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... 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


--------------------
UWAGA! Stwierdzono naruszenie paragrafu §33 ustawy ACTA. Podpis użytkownika został usunięty.
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 Wersja Lo-Fi Aktualny czas: 18.07.2025 - 14:02