やりたいこと
名前が 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'
);
解説
- サブクエリで名前が A 、サイズが 160 との絶対値のうち最も小さい値 40 を抽出
- メインクエリで名前が 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 |