Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Sortowanie varchar, zawartość literowo liczbowa
Forum PHP.pl > Forum > Bazy danych > MySQL
patrix007
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
Neo
Kod
select * from test order by LEFT(pole, 1), LENGTH(pole)
patrix007
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ć
Crozin
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.
everth
@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);
patrix007
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
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.