Discussion:
[mySQL] sortowanie numeryczne danych typu A1,A100, A2
(Wiadomość utworzona zbyt dawno temu. Odpowiedź niemożliwa.)
ppawel
2009-11-19 12:52:59 UTC
Permalink
Jak w najprostszy sposób sortować za pomocą zapytania mysql wiersze zawierające
dane o następujących oznaczeniach:

A1, A2, A3 itd

problemem zwykłego sortowania jest to iż po A1 występuje A10 następnie A100
a dopiero potem np A2.
Dodatkowo może się zdarzyć iż dane będę miał w postaci A01 , A10 , A02 ... a też
muszę mieć je posortowane zgodnie z liczbą w oznaczeniu

Jakiego rodzaju sortowania powinienem użyć aby to zadziałało ?


W ostateczności mam zamiar pobrać dane normalnie posortowane i w php dodatkowo
sortować ucinając część nie numeryczną .. ale sprawdzam czy jest zapytanie sql
mogące to obsłużyć.
--
Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
NKAB -
2009-11-23 13:24:26 UTC
Permalink
Post by ppawel
Jak w najprostszy sposób sortować za pomocą zapytania mysql wiersze zawierające
A1, A2, A3 itd
problemem zwykłego sortowania jest to iż po A1 występuje A10 następnie A100
a dopiero potem np A2.
Dodatkowo może się zdarzyć iż dane będę miał w postaci A01 , A10 , A02 ...
a te
Post by ppawel
ż
muszę mieć je posortowane zgodnie z liczbą w oznaczeniu
Jakiego rodzaju sortowania powinienem użyć aby to zadziałało ?
W ostateczności mam zamiar pobrać dane normalnie posortowane i w php dodatkowo
sortować ucinając część nie numeryczną .. ale sprawdzam czy jest zapytanie sql
mogące to obsłużyć.
Moim zdaniem to problem wpisywania danych do pól.

Wynik po sortowianiu:

pole1
-------
A1
A10
A11
A100
A101
A2
A3

Dane powinny być dobijane do prawej strony
wynik po sortowaniu:

pole 1
-------
A1
A2
A3
A10
A11
A100
A101

Andrzej.
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
\\n
2009-11-23 14:16:49 UTC
Permalink
NKAB - pisze:
...
Post by NKAB -
Moim zdaniem to problem wpisywania danych do pól.
pole1
-------
A1
A10
A11
A100
A101
A2
A3
Dane powinny być dobijane do prawej strony
pole 1
-------
A1
A2
A3
A10
A11
A100
A101
Andrzej.
Dodaj tam A01 i spróbuj jeszcze raz ;-)
--
Kiej wypiję flaszą wina - zaraz u mnie insza mina,
i ochota do śpiewania wnet mnie bierze i do grania
(ludowe)Kolberg
NKAB -
2009-11-24 06:21:00 UTC
Permalink
Post by \\n
Dodaj tam A01 i spróbuj jeszcze raz ;-)
Uważam, że prawidłowo:


wynik po sortowaniu:

pole 1
-------
A1
A2
A01
A02
A10
A001
A100
A101
A0003


Mój post pokazał, że nie narysowałeś jak ty byś chciał.

Andrzej.
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
Krzysztof Warunek
2009-11-24 03:08:34 UTC
Permalink
Post by ppawel
Jakiego rodzaju sortowania powinienem użyć aby to zadziałało ?
select * from table order by length(pole_alphanum), pole_alphanum;
--
Warunek Krzysztof
JarekW
2009-11-26 20:41:59 UTC
Permalink
Post by Krzysztof Warunek
Post by ppawel
Jakiego rodzaju sortowania powinienem użyć aby to zadziałało ?
select * from table order by length(pole_alphanum), pole_alphanum;
--
Warunek Krzysztof
Co się stanie jak dodamy np. B1,C1...
A1
A2
B1 ...
C1 ....
A01
A02
A10
A001
A100
A101
A0003

Mam podobny problem z posortowaniem zakresu A-4/1, A-5/2..... B-6/20, B-8/29
(litera A..D, cyfra 1..9, liczba 1..40)
problem sprawia ostatnia liczba która może być jedno lub dwu znakowa.
Tymczasowe rozwiązanie:
SELECT pole FROM tab ORDER BY LEFT(pole,3), RIGHT(pole,2)

Jakieś lepsze pomysły?


__________ Informacja programu ESET Smart Security, wersja bazy sygnatur wirusow 4634 (20091124) __________

Wiadomosc zostala sprawdzona przez program ESET Smart Security.

http://www.eset.pl lub http://www.eset.com
Krzysztof Warunek
2009-11-28 15:16:56 UTC
Permalink
Post by JarekW
Post by Krzysztof Warunek
Post by ppawel
Jakiego rodzaju sortowania powinienem użyć aby to zadziałało ?
select * from table order by length(pole_alphanum), pole_alphanum;
Co się stanie jak dodamy np. B1,C1...
trzeba zmienić zapytanie, dane podane przez
pytającego tego nie określały
Post by JarekW
Mam podobny problem z posortowaniem zakresu A-4/1, A-5/2..... B-6/20,
B-8/29 (litera A..D, cyfra 1..9, liczba 1..40)
problem sprawia ostatnia liczba która może być jedno lub dwu znakowa.
SELECT pole FROM tab ORDER BY LEFT(pole,3), RIGHT(pole,2)
Jakieś lepsze pomysły?
Zła organizacja danych! Trzeba zmienić te identyfikatory bo:
- albo niosą za dużo informacji i można je rozbić w tabele
- albo nie niosą żadnej informacji i to fanaberia

SELECT t.pole FROM
(SELECT pole,
SUBSTRING_INDEX(pole, '-', 1) AS 'znak',
SUBSTRING_INDEX(
SUBSTRING_INDEX(pole, '-', -1),'/',1) AS 'srodek',
SUBSTRING_INDEX(pole, '/', -1) AS 'ostatnia' FROM tab) t
ORDER BY t.znak, t.srodek,t.ostatnia

Powinno działać i w MySQL choć można to zrobić w innych szybciej
w regexp. Poza tym jak już nie ma możliwości zmiany tego pola to
lepiej mimo wszystko poza bazą sortować.

powinno działać (chociaż trzeba sprawdzić, bo nie pamiętam jak
z indexami(trzeci parametr funkcji) w mysql)
--
Krzysztof Warunek
SyZer
2009-11-30 06:02:29 UTC
Permalink
Post by ppawel
problemem zwykłego sortowania jest to iż po A1 występuje A10 następnie A100
a dopiero potem np A2.
Dodatkowo może się zdarzyć iż dane będę miał w postaci A01 , A10 , A02 ... a też
muszę mieć je posortowane zgodnie z liczbą w oznaczeniu
Jakiego rodzaju sortowania powinienem użyć aby to zadziałało ?
wywal A do osobnej kolumny i sortuj numerycznie.
polecam jakakolwiek ksiażkę do SQL - szczególnie rozdział o podstawach
baz relacyjnych.
mozesz tez wykorzystać wiadomość ze spacja jest przed cyframi
ale takie(A 1, A 9, A12 , A99) ukladanie danych jest błedne.

Loading...