2011-12-09 7 views
0

私はテーブルを持っている、それは "myvalue"と言う列を持つMyTableと呼んでください。MySQL:数値が存在する場合はそれよりも大きい値を取得しますが、存在しない場合は下位値を取得しますか?

myvalueとの比較に基づいて数値を取り、行を返すクエリが必要です。

number = myvalueの場合は、正しい行です。一致するものがなければ、数字のすぐ上の値を取る必要があります。それが存在しない場合は、数値のすぐ下の値を取る必要があります。例えばので

のがmyvalue列がこれらの値ましたとしましょう:これまでのところ、私は右のそれを超えるマッチング値または1のどちらかを返しますクエリを

100 
200 
300 
400 
500 

If I query with number=50 it will return the row with '100'. 
If I query with number=100 it will return the row with '100'. 
If I query with number=101 it will return the row with '200'. 
If I query with number=450 it will return the row with '500'. 
If I query with number=570 it will return the row with '500'. 

を持っていますが、私は方法がわかりません上記のものが存在しない場合、下のものを返すようにするには?

これは私が今何をすべきかです:

SELECT * FROM MyTable WHERE myvalue >= 'number' ORDER BY myvalue ASC LIMIT 1 

(もちろん価値の '数' を置き換える)

任意のアイデア?私はブルートフォースの方法を考えることができますが、私は考えることができないエレガントなものがあると確信しています。

答えて

1
SELECT * 
FROM (
     (
     SELECT * 
     FROM MyTable 
     WHERE myvalue >= 'number' 
     ORDER BY myvalue ASC 
     LIMIT 1 
    ) 
     UNION 
     (
     SELECT * 
     FROM MyTable 
     WHERE myvalue <= 'number' 
     ORDER BY myvalue DESC 
     LIMIT 1 
    ) 
    ) AS temp 
ORDER BY myvalue DESC 
LIMIT 1 
+0

おかげで、3件の回答のうち、これまでに、これは数は、テーブル内の最大myvalueよりも大きい場合のために働いていた唯一のものです。 – nebs

0
SELECT * FROM MyTable WHERE myvalue >= 'number' ORDER BY abs('number'-myvalue) ASC ,myvalue DESC LIMIT 1; 
関連する問題