Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][MYSQL] sortowanie
misiek172
post
Post #1





Grupa: Zarejestrowani
Postów: 656
Pomógł: 3
Dołączył: 26.10.2005
Skąd: Częstochowa

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


Witam.

Mam nastepujący kłopot:

mam baze danych w której jedna z kolumn nazywa się nr i wygląda np tak: 28/2007

chodzi mi o to aby posrotwać numery w kolejności malejącej, czyli jak mam takie numery:

19/2007
21/2007
26/2007
27/2007
25/2007
24/2007
23/2007
28/2007
325/06
20/2007
29/2007

i żeby je posortowało. Problem tkwi w tym, iż trzeba uwzględnik przy sortowaniu rok (ta liczba po /) oraz nr (liczba przed /).

Jeśli chodzi o wyciągnięcie następnej liczny w kolejności to udało mi się zrobić to tym skryptem:

  1. <?php
  2. function next_nr($nr){
  3. for($i=0;$i<count($nr);$i++){
  4. $c = explode('/', $nr[$i]);
  5. $q[$i] = Array();
  6. $q[$i][0] = $c[0];
  7. $q[$i][1] = $c[1];
  8. $w[$i] = $c[1];
  9. }
  10. $max = end($w);
  11. $v = 0;
  12. for($i=0;$i<count($q);$i++){
  13. if($q[$i][1] == $max){
  14. $tab[$v] = $q[$i][0];
  15. $v++;
  16. }
  17. }
  18. sort($tab);
  19. $war = end($tab);
  20. return ++$war.'/'.$max;
  21.  
  22. }
  23. ?>


Ale teraz musze mieć ich kolejność aby baza wyświetliła mi dane względem numerów.

Bardzo prosze o pomoc i z góry dziękuje, Łukasz.
Go to the top of the page
+Quote Post
Lonas
post
Post #2





Grupa: Zarejestrowani
Postów: 576
Pomógł: 14
Dołączył: 9.11.2005

Ostrzeżenie: (20%)
X----


Najprosciej będzie, jesli masz jeszcze mozliwosc zmien w bazie danych ten numer na 2 kolunmy -

| Numer | Rok |

wtedy bedzie latwo posortowac na poziomie mysql
Go to the top of the page
+Quote Post
macek
post
Post #3





Grupa: Zarejestrowani
Postów: 84
Pomógł: 0
Dołączył: 17.08.2006
Skąd: łódź

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


hmm, a nie łatwiej w tym wypadku będzie wyciągnąć wszystko i posortować sobie tablicę z poziomu php ? (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Lonas
post
Post #4





Grupa: Zarejestrowani
Postów: 576
Pomógł: 14
Dołączył: 9.11.2005

Ostrzeżenie: (20%)
X----


a jak posortujesz wartosci ktore kolega podał ?



26/2007
25/2007


Trzeba to rozdzielac - sortowac i skladac .. a po co
Go to the top of the page
+Quote Post
misiek172
post
Post #5





Grupa: Zarejestrowani
Postów: 656
Pomógł: 3
Dołączył: 26.10.2005
Skąd: Częstochowa

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


@Lonas

czy bede mial 2 kolumny, czy rozdziele w php według explode '/' na 2 tablice to wychodzi na to samo.

Ten post edytował misiek172 27.02.2007, 16:08:30
Go to the top of the page
+Quote Post
heaven
post
Post #6





Grupa: Nieautoryzowani
Postów: 92
Pomógł: 15
Dołączył: 21.10.2006

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


  1. SELECT * ,SUBSTRING_INDEX(nr, '/', 1) AS numerek, SUBSTRING_INDEX(nr, '/', -1) AS rok FROM testt ORDER BY rok,numerek;

posotuje wedlug roku a nastepnie wedlug numeru. jesli chcesz odwrotnie to tylko odwroc rok i numerek na koncu. jak cos to pisz. jak bede wiedzial, pomoge. pozdr

sorka powinno byc tak
  1. SELECT * ,CONVERT(SUBSTRING_INDEX(nr, '/', 1),SIGNED) AS numerek, CONVERT(SUBSTRING_INDEX(nr, '/', -1),SIGNED) AS rok FROM testt ORDER BY rok,numerek;

ech a tak naprawde jesli ma byc sortowanie malejace to powinno byc tak (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
  1. SELECT * ,CONVERT(SUBSTRING_INDEX(nr, '/', 1),SIGNED) AS numerek, CONVERT(SUBSTRING_INDEX(nr, '/', -1),SIGNED) AS rok FROM testt ORDER BY rok DESC,numerek DESC;
ciekawe ile jeszcze razy bede edytowal tego posta (IMG:http://forum.php.pl/style_emoticons/default/blink.gif)
a zeby nie tworzyc dodatkowych niepotrzebnych 2 kolumn numerek i rok to mozna to zrobic tak
  1. SELECT * FROM testt ORDER BY CONVERT(SUBSTRING_INDEX(nr, '/', -1),SIGNED) DESC,CONVERT(SUBSTRING_INDEX(nr, '/', 1),SIGNED) DESC;

jeszcze jedno, zauwazylem ze masz jeden wpis 325/06 tak wiec zeby mimo wszystko dobrze sortowalao to trzeba jeszcze inaczej to zrobic ALE warunkiem jest ze nie ma daty starszej niz 2000
  1. SELECT * FROM testt ORDER BY CONVERT(RIGHT(SUBSTRING_INDEX(nr, '/', -1),2),SIGNED) DESC,CONVERT(SUBSTRING_INDEX(nr, '/', 1),SIGNED) DESC;

a jesli ochi o zwrocenie nastepnego numeru to mozna uzyc tego juesli masz ten wpis z rokiem w postaci 2 cyfrowej 325/06
  1. SELECT CONCAT_WS('/',CONVERT(SUBSTRING_INDEX(nr, '/', 1),SIGNED)+1,CONVERT(SUBSTRING_INDEX(nr, '/', -1),SIGNED)) FROM testt ORDER BY CONVERT(RIGHT(SUBSTRING_INDEX(nr, '/', -1),2),SIGNED) DESC,CONVERT(SUBSTRING_INDEX(nr, '/', 1),SIGNED) DESC LIMIT 1;

lub tak jesli kazda data jest w postaci 4 cyfrowej (2006,2007)
  1. SELECT CONCAT_WS('/',CONVERT(SUBSTRING_INDEX(nr, '/', 1),SIGNED)+1,CONVERT(SUBSTRING_INDEX(nr, '/', -1),SIGNED)) FROM testt ORDER BY CONVERT(SUBSTRING_INDEX(nr, '/', -1),SIGNED) DESC,CONVERT(SUBSTRING_INDEX(nr, '/', 1),SIGNED) DESC LIMIT 1;

select w przypadku tych danych
19/2007
21/2007
26/2007
27/2007
25/2007
24/2007
23/2007
28/2007
325/06
20/2007
29/2007
zwroci: 30/2007

Ten post edytował heaven 28.02.2007, 14:18:09
Go to the top of the page
+Quote Post
misiek172
post
Post #7





Grupa: Zarejestrowani
Postów: 656
Pomógł: 3
Dołączył: 26.10.2005
Skąd: Częstochowa

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


Spoko dzięli wielkie działa (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif)

Wogóle niezłe zapytania, skąd ty stary masz taką wiedze o MySQL? (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Podziwiam jeśli chodzi o te zapytania powyżej.
Go to the top of the page
+Quote Post
heaven
post
Post #8





Grupa: Nieautoryzowani
Postów: 92
Pomógł: 15
Dołączył: 21.10.2006

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


Hej.
Żeby bylo śmieszniej to Ci powiem ze wiedze mamy podobną zapewne. Pierszy raz pisalem zapytanie SQL z funkcjami do stringu i conwersji typu. Wiedzialem tylko co chce zrobic a reszta to manual (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

zresztą tak to wydedukowalem.
skoro masz stringi typu 27/2007 to wystarczy wyciagnac ciag do znaku "/" a nastepnie od znaku "/".
Manual. i jest SUBSTRING_INDEX(z jakiego pola, znak rozdzielajacy, do ktorego znaku rozdzielajacego) (moze jest tez inna funkcja ale akurat ta mi w oko wpadla (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
czyli w Twoim przypadku zeby wyciagnac numer trzeba pobrac z pola nr, jedną daną do pierwszego znaku "/".
  1. SUBSTRING_INDEX(nr, '/', 1)
czyli mamy juz numer
teraz rok. pisze tez w manualu ze jak ostatni argument przyjmuje wartosc ujemna to dane czyta od konca a wlasnie na koncu jest rok
wiec
  1. SUBSTRING_INDEX(nr, '/', -1)


no i moglo by sie wydawac ze to juz wszystko ale zauwaz ze teraz przy sortowaniu liczba 14 bedzie mniejsza niz 6 a to dlatego ze on nie wie ze to sa liczby tylko traktuje to jako stringi. porownanie pierwszego znaku czyli 6 jest wieksze o 1. trzeba mu wiec powiedziec zeby zamienil ten string na liczby
Manual i jest CONVERT( co, i na co)
czyli konwertujemy SUBSTRING_INDEX(nr, '/', 1) na SIGNED wiec finalnie mamy cos takiego
  1. CONVERT(SUBSTRING_INDEX(nr, '/', 1),SIGNED)

i to sa numery
  1. CONVERT(SUBSTRING_INDEX(nr, '/', -1),SIGNED)

a to rok
jako ze miales tam jedna date 06 a nie 2006 wiec ogolnie mozna obciac 2 piersze cyfry ze wszystkich lat bo 06 jest mniejsze od np 2005
Manual i jest RIGHT(co, ile znakow) funkcja zwraca dana ilosc znakow liczac od prawej
czyli teraz rok odczytujemy tak
  1. CONVERT(RIGHT(SUBSTRING_INDEX(nr, '/', -1),2),SIGNED)

czyli 06 bedzie 06 a 2007 bedzie 07
widac ze dla roku 1999 bedzie to 99 wiec jesli masz tam daty tez starsze niz 2000 to bedzie zle sortowalo
skoro juz mamy wszsytko to wystarczy teraz dodac SELECT i posortowac wedlog tych parametrow malejaco (DESC) (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

  1. SELECT * FROM testt ORDER BY CONVERT(RIGHT(SUBSTRING_INDEX(nr, '/', -1),2),SIGNED) DESC,CONVERT(SUBSTRING_INDEX(nr, '/', 1),SIGNED) DESC;


pozdrawiam.

Ten post edytował heaven 1.03.2007, 16:32:01
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 - 09:48