2015-10-20 46 views
0

我有一個名爲price的列,我想輸入一個價格並獲得下一個最昂貴的物品,或者如果輸入的價格超出了表中可用的範圍,最昂貴的物品。如何在同一列上有多個OR條件

例如我有以下的項目在我的表

id category price 
1 Toys  12 
2 Toys  14 
3 Toys  18 
4 Toys  40 
5 Toys  38 
6 Toys  67 

所以,如果我輸入20,我想的玩具數量5(價格38)返回,因爲這是下一個大數目。如果我輸入超出表格範圍的價格,例如100那我想最昂貴的項目要返回,即玩具6號

目前,我有一個查詢類似

select * 
from items 
where category = ? and price > ? 
order by price limit 1; 

這將返回下一個最昂貴的玩具或任何其他類別的任何其他項目但如果我輸入100,那麼我將如何顯示最昂貴的物品?我可以在價格欄上有多個or嗎?

重要:我想做到這一點,而無需使用合併或者空的條件,如果可能的

回答

1

這裏有一個方法:

select i.* 
from items i 
where category = ? 
order by (price > ?) desc, 
     (case when price > ? then price end) asc, 
     price desc 
limit 1; 

然而,一個更好的方法(在性能方面)可能是這樣的:

(select i.* 
from items i 
where category = ? and price > ? 
order by price asc 
limit 1 
) union all 
(select i.* 
from items i 
where category = ? 
order by price desc 
limit 1 
) 
order by price 
limit 1; 

如果第一個子查詢沒有返回任何行,第二個將會。排序兩行的開銷很小(每個子查詢爲limit 1)。而且,這應該使用items(category, price)這兩個子查詢的大量索引。

+0

@GrodonLinoff太感謝你了,第一個不知何故似乎並沒有爲我工作..讓我嘗試第二個。 –

+0

@ john.p.doe。 。 。請注意,通配符的數量已更改。 –

+0

將查詢更改爲此可爲我提供所需的結果。如果我做錯了任何事,請糾正我。 (價格>?)desc,(當價格>?則價格結束時)asc,price desc limit 1; –

1

你可以試試這個

SELECT i.* 
FROM items i 
WHERE category = ? 
     AND (price > ? 
       OR NOT EXISTS(SELECT 1 
          FROM items 
          WHERE category = ? 
            AND price > ?)) 
    order by (Case when price >? then price else 0-price end) 
    limit 1; 
+1

我編輯了以前的答案,它爲我工作..但你的作品也很好。 Upvoted。非常感謝你的努力。 –