kóki
12.09.2010, 12:02:56
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
12.09.2010, 12:10:40
UNION
SELECT * FROM tabela WHERE `data` != '0000-0000 00:00:00'
UNION
SELECT * FROM tabela WHERE `data` = '0000-0000 00:00:00'
kóki
12.09.2010, 15:05:26
Coś nie działa. Tzn działa ale nie otrzymuję posortowanego wyniku. Może pokażę na przykładzie o co mi chodzi

.
for(a=0;$a<$z; $a++)
{
$b=$a+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"); (.....)
}
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

.
wookieb
12.09.2010, 15:16:33
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
12.09.2010, 15:34:05
Hm, dziwne, ale otrzymuję nieposortowany wynik
wookieb
12.09.2010, 17:04:52
No to podaj wynik oraz strukturę tabeli (SHOW CREATE TABLE)
kóki
13.09.2010, 09:41:39
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
13.09.2010, 10:01:07
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
13.09.2010, 12:18:45
CREATE TABLE `JAKASNAZWA` (
`id` int(xx) NOT NULL AUTO_INCREMENT,
`JAKISWERS` varchar(xx) COLLATE utf8_polish_ci NOT NULL,
`JAKISWERS` varchar(xx) COLLATE utf8_polish_ci NOT NULL,
`JAKISWERS` varchar(xx) COLLATE utf8_polish_ci NOT NULL,
`JAKISWERS` varchar(xx) COLLATE utf8_polish_ci NOT NULL,
`JAKISWERS` varchar(xx) COLLATE utf8_polish_ci NOT NULL,
`JAKISWERS` varchar(xx) COLLATE utf8_polish_ci NOT NULL,
`JAKISWERS` varchar(xx) COLLATE utf8_polish_ci NOT NULL,
`JAKISWERS` date NOT NULL,
`JAKISWERS` varchar(xx) COLLATE utf8_polish_ci NOT NULL DEFAULT 'XXXXXX',
`data` date NOT NULL,
`JAKISWERS` varchar(xx) COLLATE utf8_polish_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=43 DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci
Data przechowywana jest jako "date".
wookieb
13.09.2010, 12:27:08
Pokaż teraz całe zapytanie wybierające rekordy z którym masz problem.
kóki
14.09.2010, 10:12:47
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
14.09.2010, 10:34:27
Podaj zapytanie z UNION jakie dajesz
Podaj też wersję MYSQL
kóki
14.09.2010, 10:54:15
(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
14.09.2010, 12:12:04
UNION w MySQL chyba ignoruje sortowanie (nie wiem dlaczego)
Zrób:
SELECT *
FROM `JAKASNAZWA`
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
14.09.2010, 12:27:29
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
14.09.2010, 13:13:52
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

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