Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Niestandardowe sortowanie.
Forum PHP.pl > Forum > Bazy danych > MySQL
Pental
Witam. Handluję taśmami, które sortuję według pewnych kategorii (w skrócie: kat1 - c1, kat2 - c2, itd.). Jest ich 5. Standardowe "ORDER BY `c1`, `c2`, `c3`, `c4`, `c5`" okazało się niewystarczające, gdyż chciałbym, aby rekordy były sortowane wedle ustalonych przeze mnie wcześniej struktur. Jest to w każdym bądź razie mało istotne przy moim problemie. Chciałem, aby kod PHP generował zapytanie opierając się o inne dane. Poczytałem sobie trochę w Internecie, i wydaje mi się, że znalazłem to, czego szukałem. Nie znalazłem jednak rozwiązań dla wielu wartości, wedle których chcemy rekordy sortować. Mój kod PHP wygenerował następujące zapytanie MySQL:
  1. SELECT `c1`, `c2`, `c3`, `c4`, `c5`, `name`, `id`, `status` FROM `products` WHERE `panel`='36' CASE `c1` WHEN 'Tesa' THEN 1 WHEN 'Coroplast' THEN 2 WHEN 'Certoplast' THEN 3 ELSE NULL END AS `cs1` CASE `c2` WHEN 'Isolationsband' THEN 1 WHEN 'Gewebeband' THEN 2 WHEN 'Gewebeband mit Flies' THEN 3 ELSE NULL END AS `cs2` CASE `c3` WHEN '8110' THEN 1 WHEN '51026' THEN 2 WHEN '525 SE' THEN 3 WHEN '51026' THEN 4 WHEN '51608' THEN 5 WHEN '8551' THEN 6 WHEN '8550' THEN 7 WHEN '4252' THEN 8 WHEN '53947' THEN 9 WHEN '837X' THEN 10 ELSE NULL END AS `cs3` CASE `c4` WHEN '9mm' THEN 1 WHEN '15mm' THEN 2 WHEN '19mm' THEN 3 WHEN '25mm' THEN 4 WHEN '50mm' THEN 5 WHEN '30mm' THEN 6 ELSE NULL END AS `cs4` CASE `c5` WHEN '1' THEN 1 WHEN '3' THEN 2 WHEN '8' THEN 3 WHEN '9' THEN 4 WHEN '10' THEN 5 ELSE NULL END AS `cs5` ORDER BY `cs1`, `cs2`, `cs3`, `cs4`, `cs5`

Moje pytanie jest następujące: Co jest w szkielecie tego zapytania nie tak? Nie chcę prosić o kod PHP, bo po pierwsze, nie chcę gotowca, po drugie, musiałbym tłumaczyć o co mi dokładnie chodzi. Tak naprawdę interesuje mnie tylko fakt, dlaczego nic nie mogę wyciągnąć z takiego zapytania (brak rekordów). Prosiłbym o wyrozumiałość.

Pozdrawiam smile.gif !
bpskiba
Tak na pierwszy rzut oka.... błędy w gramatyce SQL

CASE należało by użyć w sekcji SELECT a nie po where. Alias nie działa tak, jak Ty to napisałeś

http://www.1keydata.com/sql/sql-case.html
Pental
Naprawdę nie chciałem być nachalny i prosić o gotowe rozwiązania, ale... Nie mam pojęcia jak sobie poradzić z tymi cudzysłowami i apostrofami... Mógłbym prosić o jakiś przykład dla chociaż dwóch kategorii i kilku wartości? Nie wiem jak się zabrać za te zapytanie.
bpskiba
  1. SELECT `id`,`name`,`status`,CASE c1 WHEN 'tesa' THEN 1
  2. WHEN 'Coroplast' THEN 2
  3. ELSE 0
  4. END
  5. FROM products
  6. WHERE panel=36
Pental
Em, ale tu jest tylko uwzględnione c1, ja chciałbym przykład z c1, c2, chodzi mi o to, jak potem wykorzystać te "case" przy ORDER BY. Pozdrawiam.

Edit: Wyszło mi takie coś, ale wciąż 0 rekordów daje:
  1. SELECT `c1`, `c2`, `c3`, `c4`, `c5`, `name`, `id`, `status` CASE c1 WHEN 'Tesa' THEN 1 WHEN 'Coroplast' THEN 2 WHEN 'Certoplast' THEN 3 ELSE 0 END AS cs1 CASE c2 WHEN 'Isolationsband' THEN 1 WHEN 'Gewebeband' THEN 2 WHEN 'Gewebeband mit Flies' THEN 3 ELSE 0 END AS cs2 CASE c3 WHEN '8110' THEN 1 WHEN '51026' THEN 2 WHEN '525 SE' THEN 3 WHEN '51026' THEN 4 WHEN '51608' THEN 5 WHEN '8551' THEN 6 WHEN '8550' THEN 7 WHEN '4252' THEN 8 WHEN '53947' THEN 9 WHEN '837X' THEN 10 ELSE 0 END AS cs3 CASE c4 WHEN '9mm' THEN 1 WHEN '15mm' THEN 2 WHEN '19mm' THEN 3 WHEN '25mm' THEN 4 WHEN '50mm' THEN 5 WHEN '30mm' THEN 6 ELSE 0 END AS cs4 CASE c5 WHEN '1' THEN 1 WHEN '3' THEN 2 WHEN '8' THEN 3 WHEN '9' THEN 4 WHEN '10' THEN 5 ELSE 0 END AS cs5 ORDER BY `cs1`, `cs2`, `cs3`, `cs4`, `cs5` FROM `products` WHERE `panel`='36'
bpskiba
  1. SELECT `id`,`name`,`status`,CASE c1 WHEN 'tesa' THEN 1
  2. WHEN 'Coroplast' THEN 2
  3. ELSE 0
  4. END,
  5. CASE c2 WHEN 'Isolationsband' THEN 1
  6. WHEN 'Gewebeband' THEN 2
  7. END
  8. FROM products
  9. WHERE panel=36
  10. ORDER BY 3,4
Pental
  1. SELECT `name`, `id`, `status` CASE c1 WHEN 'Tesa' THEN 1 WHEN 'Coroplast' THEN 2 WHEN 'Certoplast' THEN 3 ELSE 0 END, CASE c2 WHEN 'Isolationsband' THEN 1 WHEN 'Gewebeband' THEN 2 WHEN 'Gewebeband mit Flies' THEN 3 ELSE 0 END, CASE c3 WHEN '8110' THEN 1 WHEN '51026' THEN 2 WHEN '525 SE' THEN 3 WHEN '51026' THEN 4 WHEN '51608' THEN 5 WHEN '8551' THEN 6 WHEN '8550' THEN 7 WHEN '4252' THEN 8 WHEN '53947' THEN 9 WHEN '837X' THEN 10 ELSE 0 END, CASE c4 WHEN '9mm' THEN 1 WHEN '15mm' THEN 2 WHEN '19mm' THEN 3 WHEN '25mm' THEN 4 WHEN '50mm' THEN 5 WHEN '30mm' THEN 6 ELSE 0 END, CASE c5 WHEN '1' THEN 1 WHEN '3' THEN 2 WHEN '8' THEN 3 WHEN '9' THEN 4 WHEN '10' THEN 5 ELSE 0 END FROM products WHERE panel=36 ORDER BY 3, 4, 5, 6, 7

Co teraz źle sad.gif ?

Edit: Ok, brak jednego przecinka, wszystko działa, wielkie dzięki!
bpskiba
SELECT `name`, `id`, `status` , CASE c1 WHEN '....
trafas
I proponuję koledze zacząć stosować łamanie linii i wcięcia.
Wtedy o wiele łatwiej jest wyłapać ewentualne błędy typu "zgubiony" przecinek smile.gif
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.