Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL] sortowanie
Forum PHP.pl > Forum > PHP
misiek172
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.
Lonas
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
macek
hmm, a nie łatwiej w tym wypadku będzie wyciągnąć wszystko i posortować sobie tablicę z poziomu php ? smile.gif
Lonas
a jak posortujesz wartosci ktore kolega podał ?



26/2007
25/2007


Trzeba to rozdzielac - sortowac i skladac .. a po co
misiek172
@Lonas

czy bede mial 2 kolumny, czy rozdziele w php według explode '/' na 2 tablice to wychodzi na to samo.
heaven
  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 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 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
misiek172
Spoko dzięli wielkie działa biggrin.gif

Wogóle niezłe zapytania, skąd ty stary masz taką wiedze o MySQL? smile.gif

Podziwiam jeśli chodzi o te zapytania powyżej.
heaven
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 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 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) 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.
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.