LoginSignup
0
0

More than 1 year has passed since last update.

【MySQL】検索したい数値により近いデータを取得したい

Last updated at Posted at 2022-09-26

やりたいこと

名前が A でサイズが 160 に近いデータの金額を取得したい

id name size price
1 A 100 3000
2 A 200 4000
3 A 300 5000
4 B 100 9000
5 B 200 10000

結果としてこうなるようにしたい

id name size price
2 A 200 4000

ABS関数で絶対値を活用する

SELECT
    *
FROM
    `test`
WHERE
    `name` = 'A' 
    AND ABS(`size` - 160) = (
            SELECT
                MIN(ABS(`size` - 160))
            FROM
                `test`
            WHERE
                `name` = 'A'
        );

解説

  1. サブクエリで名前が A 、サイズが 160 との絶対値のうち最も小さい値 40 を抽出
  2. メインクエリで名前が A 、サイズが 160 との絶対値が 40 に一致するデータを取得

検索値が中間にあるときには注意が必要

例えば、名前が A でサイズが 250 に近いデータを取得したい時には、サブクエリで絶対値 50 が抽出され、サイズが200と300のデータがヒットしてしまいます。

id name size price
2 A 200 4000
3 A 300 5000

一意のデータが欲しい際には要件を確認しましょう。

対応例

検索値により近いサイズの金額を取得したい。間の値の際は低い金額を優先すること。

SELECT
    MIN(`price`) AS 'result'
FROM
    `test`
WHERE
    `name` = 'A' 
    AND ABS(`size` - 250) = (
            SELECT
                MIN(ABS(`size` - 250))
            FROM
                `test`
            WHERE
                `name` = 'A'
        );

取得の結果

result
4000
0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0