![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 132 Pomógł: 4 Dołączył: 22.10.2010 Ostrzeżenie: (0%) ![]() ![]() |
Mam taką tabelę:
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:
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.
|
|
|
![]()
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" ?
-------------------- |
|
|
![]()
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? |
|
|
![]()
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.
|
|
|
![]()
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 -------------------- |
|
|
![]()
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ę. |
|
|
![]()
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.
|
|
|
![]()
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ć
![]()
-------------------- |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 132 Pomógł: 4 Dołączył: 22.10.2010 Ostrzeżenie: (0%) ![]() ![]() |
Hmm...
![]()
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:
`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.
|
|
|
![]()
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:
Ten post edytował redeemer 7.07.2012, 12:42:33 -------------------- |
|
|
![]()
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. ![]() -------------------- UWAGA! Stwierdzono naruszenie paragrafu §33 ustawy ACTA. Podpis użytkownika został usunięty.
|
|
|
![]()
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.
-------------------- |
|
|
![]()
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ć:
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... ![]() Faktycznie posortowały się tak jak powinny. ![]() 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... ![]() -------------------- UWAGA! Stwierdzono naruszenie paragrafu §33 ustawy ACTA. Podpis użytkownika został usunięty.
|
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 18.07.2025 - 14:02 |