Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] Sortowanie po warunku - zła kolejność
Forum PHP.pl > Forum > Bazy danych > MySQL
epicmonkey
Cześć, mam problem z jednym zapytaniem.
Mam prostą tabelkę:

  1. CREATE TABLE `dev_a4a`.`test` ( `id` INT UNSIGNED NOT NULL
  2. AUTO_INCREMENT , `type` VARCHAR(45) NOT NULL , `priority` INT NOT
  3. NULL , PRIMARY KEY (`id`) );


i takie rekordy:

  1. id|type |priority
  2. 1 |long |8
  3. 2 |long |3
  4. 3 |short|9
  5. 4 |short|1


Chce posortować rekordy po wyrażeniu warunkowym. Jeśli typ rekordu to 'short' wartość do sortowania to 2, jeśli nie to wartość wyliczana jest na podstawie kolumny priority z użyciem RAND():

  1. SELECT (RAND() * priority) AS prio, type, priority FROM test
  2. ORDER BY (IF(type = 'short', '2', prio)) DESC, id DESC


Jako rezultat dostaję różne wyniki (w końcu jest RAND()), ale są one w większości niepoprawne. Jeden z rezultatów, które dostałem:

  1. prio | type | priority
  2. '0.05013570194145264', 'long', '8'
  3. '2.9015473750434326', 'long', '3'
  4. '0.320064320527077', 'short', '1'
  5. '7.598900996706356', 'short', '9'


Co powinienem dostać:

  1. prio | type | priority
  2. '2.9015473750434326', 'long', '3' <- ORDER BY prio
  3. '7.598900996706356', 'short', '9' <- ORDER BY 2
  4. '0.320064320527077', 'short', '1' <- ORDER BY 2
  5. '0.05013570194145264', 'long', '8' <- ORDER BY prio


Co robię źle?
mmmmmmm
Rozumiem, że pole 'prio' potrzebne ci jest tylko do sortowania?
Jeśli tak, to spróbuj tak:
  1. SELECT CASE WHEN type = 'short' THEN 2 ELSE RAND() * priority END AS prio, type, priority FROM test
  2. ORDER BY 1 DESC, id DESC
epicmonkey
Dzięki, dokładnie o to chodziło specool.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.