Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL]Sortowanie selektywne
Forum PHP.pl > Forum > Przedszkole
kóki
Chciałbym pobrać dane z tabeli posortowane rosnąco, okrojone wieloma warunkami WHERE a do tego ustawiające wartości zerowe (sortowanie względem pól daty, więc wartości zerowe to 0000-00-00) na samym końcu. Mam problemy z tym ostatnim. Czy jest na to jakaś komenda? Proszę o pomoc.
wookieb
UNION

  1. SELECT * FROM tabela WHERE `data` != '0000-0000 00:00:00'
  2. UNION
  3. SELECT * FROM tabela WHERE `data` = '0000-0000 00:00:00'

kóki
Coś nie działa. Tzn działa ale nie otrzymuję posortowanego wyniku. Może pokażę na przykładzie o co mi chodzi snitch.gif.
  1. for(a=0;$a<$z; $a++)
  2. {
  3. $b=$a+1;
  4. mysql_query("SELECT * FROM daty WHERE $warunek AND data!='0000-00-00' ORDER BY data UNION SELECT * FROM daty WHERE $warunek AND data='0000-00-00' LIMIT $a,$b");
  5. (.....)
  6.  
  7. }


Gdy "ORDER BY data" znajduje się w tym miejscu, co w napisanym przeze mnie kodzie, to mysql_query nie zwraca nic.

Gdy wstawiam "ORDER BY data" przed LIMIT $a,$b to efekt jest ten sam, jak gdy nie używałem UNION. Wartości zerowe są przesuwane na sam początek sad.gif.
wookieb

  1. mysql_query(" (SELECT * FROM daty WHERE $warunek AND data!='0000-00-00' ORDER BY data) UNION (SELECT * FROM daty WHERE $warunek AND data='0000-00-00') LIMIT $a,$b");
kóki
Hm, dziwne, ale otrzymuję nieposortowany wynik
wookieb
No to podaj wynik oraz strukturę tabeli (SHOW CREATE TABLE)
kóki
2013-03-15
2010-11-30
2010-09-30
2010-09-27
2010-09-17
2010-09-28
2010-09-30
2010-09-28
2010-09-09
2010-09-10
2010-09-26
2010-09-16
2010-09-29
2010-09-11
2010-09-21
2010-09-29
2010-09-16
2010-09-24
2010-09-11
2010-09-11
2010-09-28
2010-09-29
2010-09-11
2010-09-23
2010-09-24
2010-09-21
2010-09-20
2010-09-27
2010-09-21
2010-09-17
2010-09-26
2010-09-22
2010-09-17
2010-09-11
2010-09-10
2010-09-30
0000-00-00
0000-00-00

Zera niby są na końcu. ale wszystkie poprzednie wartości są posortowane względem ID . Czyli tak jakby nie były sortowane.
wookieb
Dziwne. Jaki masz typ pola przechowującego twoją datę?
No i nie podałeś struktury tabeli :/ A tak to już byśmy znali odpowiedź.
kóki
  1. CREATE TABLE `JAKASNAZWA` (
  2. `id` int(xx) NOT NULL AUTO_INCREMENT,
  3. `JAKISWERS` varchar(xx) COLLATE utf8_polish_ci NOT NULL,
  4. `JAKISWERS` varchar(xx) COLLATE utf8_polish_ci NOT NULL,
  5. `JAKISWERS` varchar(xx) COLLATE utf8_polish_ci NOT NULL,
  6. `JAKISWERS` varchar(xx) COLLATE utf8_polish_ci NOT NULL,
  7. `JAKISWERS` varchar(xx) COLLATE utf8_polish_ci NOT NULL,
  8. `JAKISWERS` varchar(xx) COLLATE utf8_polish_ci NOT NULL,
  9. `JAKISWERS` varchar(xx) COLLATE utf8_polish_ci NOT NULL,
  10. `JAKISWERS` date NOT NULL,
  11. `JAKISWERS` varchar(xx) COLLATE utf8_polish_ci NOT NULL DEFAULT 'XXXXXX',
  12. `data` date NOT NULL,
  13. `JAKISWERS` varchar(xx) COLLATE utf8_polish_ci NOT NULL,
  14. PRIMARY KEY (`id`)
  15. ) ENGINE=MyISAM AUTO_INCREMENT=43 DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci


Data przechowywana jest jako "date".
wookieb
Pokaż teraz całe zapytanie wybierające rekordy z którym masz problem.
kóki
Przepraszam, ale nie jestem pewien co masz na myśli.
Ale tego typu polecenie nie działa na żadnym z przykładów. W momencie gdy używam union to sortowanie przestaje działać. (No chyba, że sortuję już połączone wyniki. Ale wszystkie wiersze gdzie data jest różna od 0000-00-00 i wszystkie gdzie jest równa 0000-00-00 to i tak to samo co wszystkie wiersze. Czyli jestem w tym samym miejscu.) Dopóki nie łączę dwóch selectów to normalnie mi sortuje te daty w każdym select'ie. To wygląda jakby UNION psuło kolejność. Zapamiętuje parę zbiorów i zna ich kolejność względem siebie ale miesza kolejność wartości w ich wnętrzu. Może się mylę, ale wydaje mi się, że w taki sposób tego nie obejdę :C.
wookieb
Podaj zapytanie z UNION jakie dajesz

Podaj też wersję MYSQL
kóki
  1. (SELECT * FROM `JAKASNAZWA` WHERE `data`!='0000-00-00' ORDER BY `data` ) UNION (SELECT * FROM `JAKASNAZWA` WHERE `data`='0000-00-00')

ale powiem szczerze, że próbowałem też dziesiątki innych kombinacji. Nawet takich najgłupszych. Na zasadzie "a nóż chwyci". Zawsze gdy łączę dwa SELECTy UNIONEM to wartości w każdym z tych selectów są nieposortowane .

5.1.49-1
Noidea
UNION w MySQL chyba ignoruje sortowanie (nie wiem dlaczego)
Zrób:
  1. SELECT *
  2. FROM `JAKASNAZWA`
  3. ORDER BY `data` = '0000-00-00', `data`


`data` = '0000-00-00' zwraca 1 jeśli są równe i 0 jeśli różne. Jako że 1 jest większe od 0, to daty 0000-00-00 będą na końcu, a wszystkie inne na początku.
wookieb
Faktycznie UNION ignoruje kolejność ale TYLKo w tym przypadku kiedy w pojedynczych zapytaniach nie podamy LIMIT. Dziwne, aczkolwiek NOIDEA podał prawidłowa rozwiązanie.
Przepraszam za wprowadzenie w błąd. Czeka mnie porządna lektura manuala Mysql :/
kóki
Bardzo dziękuję. Sposób podany przez Noidea działa.

Cytat
Przepraszam za wprowadzenie w błąd.

Nie ma za co. Dzięki za czujność i dobre chęci smile.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.