2010-02-13 18 views
19

mam tej tabeli (uproszczony):MySql warunkowy zamówienie przez

 
CREATE TABLE `my_table` (
    `id` INT NOT NULL AUTO_INCREMENT , 
    `item_name` VARCHAR(45) NULL , 
    `price` DECIMAL(10,0) NULL , 
    PRIMARY KEY (`id`)) 

muszę zaznaczyć wszystkie pozycje z tabeli, uporządkowane w ten sposób:
1. przedmioty z ceną> 0,00 najpierw sortowane według ceny ASC
2. pozycji z ceną = 0,00 wreszcie uporządkowane według id

próbowałem to:

 
    SELECT * 
    FROM my_table 
    WHERE 1 
    ORDER BY 
     CASE price WHEN !0.00 THEN price 
     ELSE id 
     END 
    ASC 

I ja dostać wyniki jak

 
item_name | price 
----------|------- 
foo  | 150,00 
bar  | 0,00 
baz  | 500,00 
hum  | 0,00 

Jak zbudować kwerendę mieć

 
item_name | price 
----------|------- 
foo  | 150,00 
baz  | 500,00 
bar  | 0,00 
hum  | 0,00 

?

Dziękuję za poświęcony czas

Odpowiedz

33

Ten rade ..

SELECT * 
    FROM my_table 
    WHERE 1 
    ORDER BY 
     CASE price WHEN 0 THEN 1 
     ELSE -1 
     END ASC, price asc, id asc 
+0

+1 za przeczytanie pytania. –

+0

Cudownie, dziękuję bardzo! Jedno pytanie, 1 i -1 z THEN i ELSE, co one oznaczają? – ecstrim

+3

Oznacza to, gdy cena wynosi 0, przypisz 1 do sortowania, w przeciwnym razie przypisz -1. Dowolne dwie wartości będą działać, o ile wartość THEN jest większa niż wartość ELSE. –

17

Można również użyć następujących:

SELECT * 
FROM my_table 
WHERE 1 
ORDER BY price=0, price, id; 

Część 'cena = 0' będzie 1 dla przedmiotów o zerowej cenie, 0 dla przedmiotów o niezerowej cenie. Ponieważ domyślnym porządkiem sortowania jest ASC, niezerowe elementy są teraz umieszczane jako pierwsze.

Następny bit klauzuli order-by oznacza, że ​​niezerowe pozycje są następnie sortowane według ceny (ponownie rosnącej). Jeśli jakiekolwiek przedmioty o cenie innej niż zero mają tę samą cenę, zostaną posortowane według identyfikatora, ale nie przejmujemy się tym.

Ostatnia część dotyczy tylko przedmiotów, w których cena = 0. Ponieważ wszystkie te produkty mają tę samą cenę, efektem jest posortowanie wszystkich przedmiotów o zerowej cenie według identyfikatora.

Powiązane problemy