Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL]Sortowanie selektywne
kóki
post
Post #1





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 9.08.2010

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


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.
Go to the top of the page
+Quote Post
wookieb
post
Post #2





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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'

Go to the top of the page
+Quote Post
kóki
post
Post #3





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 9.08.2010

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


Coś nie działa. Tzn działa ale nie otrzymuję posortowanego wyniku. Może pokażę na przykładzie o co mi chodzi (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/sad.gif) .

Ten post edytował kóki 12.09.2010, 15:14:52
Go to the top of the page
+Quote Post
wookieb
post
Post #4





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk





  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");
Go to the top of the page
+Quote Post
kóki
post
Post #5





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 9.08.2010

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


Hm, dziwne, ale otrzymuję nieposortowany wynik
Go to the top of the page
+Quote Post
wookieb
post
Post #6





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




No to podaj wynik oraz strukturę tabeli (SHOW CREATE TABLE)

Ten post edytował wookieb 12.09.2010, 17:05:07
Go to the top of the page
+Quote Post
kóki
post
Post #7





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 9.08.2010

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


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.
Go to the top of the page
+Quote Post
wookieb
post
Post #8





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Dziwne. Jaki masz typ pola przechowującego twoją datę?
No i nie podałeś struktury tabeli :/ A tak to już byśmy znali odpowiedź.

Ten post edytował wookieb 13.09.2010, 10:01:37
Go to the top of the page
+Quote Post
kóki
post
Post #9





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 9.08.2010

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


  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".
Go to the top of the page
+Quote Post
wookieb
post
Post #10





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Pokaż teraz całe zapytanie wybierające rekordy z którym masz problem.
Go to the top of the page
+Quote Post
kóki
post
Post #11





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 9.08.2010

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


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.
Go to the top of the page
+Quote Post
wookieb
post
Post #12





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Podaj zapytanie z UNION jakie dajesz

Podaj też wersję MYSQL
Go to the top of the page
+Quote Post
kóki
post
Post #13





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 9.08.2010

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


  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
Go to the top of the page
+Quote Post
Noidea
post
Post #14





Grupa: Zarejestrowani
Postów: 226
Pomógł: 61
Dołączył: 20.08.2010

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


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.
Go to the top of the page
+Quote Post
wookieb
post
Post #15





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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 :/
Go to the top of the page
+Quote Post
kóki
post
Post #16





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 9.08.2010

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


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 (IMG:style_emoticons/default/smile.gif) .
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 00:51