Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Sortowanie varchar, zawartość literowo liczbowa
patrix007
post 29.07.2010, 20:26:53
Post #1





Grupa: Zarejestrowani
Postów: 46
Pomógł: 0
Dołączył: 18.07.2010

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


Witam,

mam wpisy typu (w jednej kolumnie, jest to litera z cyfrą):
Kod
a1, a2, a3 ... a10 ... a100 ... a1000, b1, b2, b3 ... b10 ... b100 ... b1000, c1 ...

i tak dalej

chciałbym to posortować w w/w kolejności, niestety zwykłe ORDER BY wymięka bo otrzymuję wyniki w stylu:
Kod
a1, a21, a3, a4, a5, a51, a5, b2 ...

jak widać kolejność jeśli chodzi o literę jest ok (w ramach zwykłego ORDER BY), tylko nie tak sortuje liczbę w ramach litery
litera jest zawsze jedna, liczby za to mają różną długość

Dziękuję za cynk smile.gif

Ten post edytował patrix007 29.07.2010, 20:27:37
Go to the top of the page
+Quote Post
Neo
post 29.07.2010, 20:43:37
Post #2





Grupa: Zarejestrowani
Postów: 43
Pomógł: 9
Dołączył: 8.08.2009
Skąd: Olsztyn

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


Kod
select * from test order by LEFT(pole, 1), LENGTH(pole)
Go to the top of the page
+Quote Post
patrix007
post 29.07.2010, 21:42:29
Post #3





Grupa: Zarejestrowani
Postów: 46
Pomógł: 0
Dołączył: 18.07.2010

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


Zapytanie typu
Kod
select * from test order by LEFT(pole, 1), LENGTH(pole)

lub typu
Kod
select * from test order by LEFT(pole, 1), LENGTH(pole) ASC

generuje wynik:
Kod
a1, a6, a5, a4, a3, a21, a51, b2

dziwna sprawa

Zapytanie typu
Kod
select * from test order by LEFT(pole, 1), LENGTH(pole) DESC

generuje wynik:
Kod
a21, a51, a1, a6, a5, a4, a3, b2

przy DESC powinno lecieć od końca alfabetu a liczby w ramach liter maleć

Ten post edytował patrix007 29.07.2010, 21:50:06
Go to the top of the page
+Quote Post
Crozin
post 29.07.2010, 22:17:42
Post #4





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Nie wiem dlaczego masz taką strukturę danych (tj. czemu to nie są dwie osobne kolumny), ale:
  1. SELECT col_name FROM tbl_name ORDER BY SUBSTRING(col_name, 0, 1), CAST(LEFT(col_name, 1) AS SIGNED);


@DOWN: Oczywiście, że tak! Mój błąd. Już poprawione. winksmiley.jpg

EDIT: Konieczna okazała się zamiana INTEGER na SIGNED.

Ten post edytował Crozin 29.07.2010, 23:51:12
Go to the top of the page
+Quote Post
everth
post 29.07.2010, 22:43:34
Post #5





Grupa: Zarejestrowani
Postów: 782
Pomógł: 153
Dołączył: 21.07.2010

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


@Crozin, czy tu nie powinno być przypadkiem na odwrót?
  1. SELECT col_name FROM tbl_name ORDER BY LEFT(col_name, 1), CAST(SUBSTRING(col_name, 2) AS INTEGER);


--------------------
Już mi się ani wiedzieć, ani tym bardziej myśleć nie chce.
[Think different]!
Go to the top of the page
+Quote Post
patrix007
post 29.07.2010, 23:41:19
Post #6





Grupa: Zarejestrowani
Postów: 46
Pomógł: 0
Dołączył: 18.07.2010

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


Ani jedno ani drugie coś mi nie działa:

Kod
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INTEGER )
LIMIT 0, 30' at line 1


Edit.

Mała przeróbka i poszło, przetestuję to jeszcze jutro

  1. SELECT col_name FROM tbl_name ORDER BY LEFT(col_name, 1), CONVERT(SUBSTRING(col_name, 2), SIGNED) ASC;

Powyższe zapytanie generuje wyniki:
Kod
a1, a3, a4, a5, a6, a21, a51, b2

  1. SELECT col_name FROM tbl_name ORDER BY LEFT(col_name, 1) DESC, CONVERT(SUBSTRING(col_name, 2), SIGNED) DESC;

Powyższe zapytanie generuje wyniki:
Kod
d8, b2, a602, a600, a51, a21, a5, a1


Różnic w wynikach nie należy brać pod uwagę bo wklejam przykładowe 'skacząc po nich', chodzi o samą kolejność smile.gif
Nie wiem na ile to poprawne jest no ale działa,

bardzo coś takiego obciąża mysql ?



@Crozin

Zapytanie:
  1. SELECT col_name FROM tbl_name ORDER BY SUBSTRING(col_name, 0, 1), CAST(LEFT(col_name, 1) AS SIGNED);

generuje wyniki:
Kod
a1, b2, a6, a5, a4, a3, a21, a51


Ten post edytował patrix007 30.07.2010, 00:27:55
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 18.07.2025 - 11:03