Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> ORDER BY [część tekstu]
sc0rpi0
post
Post #1





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 27.07.2010

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


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...
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
sniver
post
Post #2





Grupa: Zarejestrowani
Postów: 159
Pomógł: 5
Dołączył: 31.08.2007

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


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


--------------------
Go to the top of the page
+Quote Post
sc0rpi0
post
Post #3





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 27.07.2010

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


A gdy takich produktów nie mam 4-5 tylko 500-600?
Wtedy trochę by mi zeszło pisać takie zapytanie biggrin.gif
Go to the top of the page
+Quote Post
sniver
post
Post #4





Grupa: Zarejestrowani
Postów: 159
Pomógł: 5
Dołączył: 31.08.2007

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


a ten kod zawsze będzie mieć następujący wymiar: 2 literki, np. AB i cyferki lub cyferka?


--------------------
Go to the top of the page
+Quote Post
sc0rpi0
post
Post #5





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 27.07.2010

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


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.

Ten post edytował sc0rpi0 19.10.2010, 16:37:34
Go to the top of the page
+Quote Post
sniver
post
Post #6





Grupa: Zarejestrowani
Postów: 159
Pomógł: 5
Dołączył: 31.08.2007

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


A normalne ORDER BY `KOD` ASC nie zadziała jak należy?


--------------------
Go to the top of the page
+Quote Post
sc0rpi0
post
Post #7





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 27.07.2010

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


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...).

Ten post edytował sc0rpi0 19.10.2010, 16:49:43
Go to the top of the page
+Quote Post
sniver
post
Post #8





Grupa: Zarejestrowani
Postów: 159
Pomógł: 5
Dołączył: 31.08.2007

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


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...

Ten post edytował sniver 19.10.2010, 17:11:12


--------------------
Go to the top of the page
+Quote Post
sc0rpi0
post
Post #9





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 27.07.2010

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


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

Pozdrawiam
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 Aktualny czas: 22.08.2025 - 03:38