Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: ORDER BY [część tekstu]
Forum PHP.pl > Forum > Bazy danych > MySQL
sc0rpi0
Witam

Potrzebuję pomocy ze skonstruowaniem zapytania SQL, a mój problem dotyczy dokładnie instrukcji ORDER BY:
Otóż czy da się zrobić sortowanie wg tylko części (np. 2 znaków) z danej kolumny?

Załóżmy, że mam takie wpisy w tabeli produktów:
Kod
KOD     WYDAJNOSC     POJEMNOSC
AC 444     50          115
AC 222     50          110
AC 11      60          80
DC 22      30          90
DC 11      35          90

I chcę zrobić proste sortowanie ORDER BY KOD, WYDAJNOSC, POJEMNOSC z tym, aby do KOD brało tylko dwa pierwsze znaki, czyli aby w wynikach najpierw pojawiły się wszystkie produkty o początku kodu "AC", a następnie te o kodzie "DC" a dla produktów o takim samym początku kodu kolejnym kryterium ma być WYDAJNOSC a następnie POJEMNOSC.
W efekcie chciałbym uzyskać kolejność AC 222, AC 444, AC 11, DC 22, DC 11.

Dziękuję za wszelkie sugestie...
sniver
nie wiem czy da się wyciągając fragment tekstu to jakość posortować, ale napewno da się tak:
  1.  
  2. SELECT
  3. *,
  4. IF( `KOD` = 'AC 444', 1,
  5. IF( `KOD` = 'AC 222', 2,
  6. IF( `KOD` = 'AC 11', 3,
  7. IF( `KOD` = 'DC 22', 4,
  8. IF( `KOD` = 'DC 11', 5, 6
  9. )
  10. )
  11. )
  12. )
  13. ) AS `qaz`
  14.  
  15. FROM
  16. nazwaTejTabeli
  17. ORDER BY `qaz` ASC, WYDAJNOSC ASC, POJEMNOSC ASC


Mam nadzieje że sie nie machnąłem gdzieś z tymi nawiasami smile.gif
nie eleganckie i takie niejakie ale póki nie znajdziesz niczego lepszego dobre i to tongue.gif
sc0rpi0
A gdy takich produktów nie mam 4-5 tylko 500-600?
Wtedy trochę by mi zeszło pisać takie zapytanie biggrin.gif
sniver
a ten kod zawsze będzie mieć następujący wymiar: 2 literki, np. AB i cyferki lub cyferka?
sc0rpi0
Zakładam, że tak.
Posiadam też tabele, gdzie są kody produktów np. AC, EDC, ERE itd, ale wówczas zamiast dwóch literek wziąłbym pod uwagę 3.
A po literkach są cyferki lub inne znaki (które mnie nie interesują).
W każdym razie dla danego zapytania ilość literek jest stała.
sniver
A normalne ORDER BY `KOD` ASC nie zadziała jak należy?
sc0rpi0
Nie, bo ja chcę aby wzięło najpierw wszystkie AC (tak aby np. AC 222 było równe AC 444 i równe AC 11 - ze względu na takie same 2 pierwsze znaki) i dla nich zastosowało sortowanie po wydajności a potem po pojemności.
A przy zwykłym sortowaniu sortuje po całym kodzie (AC 222 jest różne od AC 333) i kryterium wydajności nawet nie stosuje, bo każdy kod jest inny.

Czyli w wyniku mają być najpierw wszystkie AC posortowane wg wydajności (a gdy jest taka sama to po pojemności) a potem wszystkie DC (posortowane tak samo...).
sniver
ok
podziel w takim razie `kod` na 2 części tak by oddzielnie było: AC i cyferki smile.gif
jeśli jest taka możliwość to wystarczy skorzystać z substr(`KOD`, 1, 2) - pokaże pierwsze 2 literki ciągu..
no i potem już wiadome od 3 lini i do końca - by wyliczyć ile do końca skorzystaj z funkcji length i gotowe smile.gif

  1. SELECT
  2. *,
  3. substr(`KOD`, 1, 2) AS `literki`,
  4. trim(substr(`KOD`, 3, length(`KOD`))) AS `cyferki`
  5. FROM
  6. tabelka
  7. ORDER BY
  8. `literki` ASC,
  9. `cyferki` DESC

..ITD...
sc0rpi0
Coś właśnie takiego!
Świetnie, wielkie dzięki za szybką pomoc.

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.