1

假设我有一个表 A。这个表有 ID、X_value、Y_value。这是表A的内容:

表 A

ID X_value Y_value
1  100     150
2  110     170
3  120     190

现在,如果我将数字130与范围数字(X_value - Y_value)进行比较,我想获得具有最小(最小)差异的范围 ID!如果我可以这样命名?我们马上看到数字130将落入所有这些范围,但我需要范围 ID 与130和范围数字之间的最小(最小)差异。详细说明这种差异:

For range 1: 130-100=30 and 150-130=20
For range 2: 130-110=20 and 170-130=40
For range 3: 130-120=10 and 190-130=60

从这个阐述中,我们看到最小差异在第三个范围(即10),所以我想得到 ID 3。如果我在 MySQL 数据库中有这个表,这个例子的查询是什么?!

4

3 回答 3

2

试试这个:

SELECT * 
FROM Table1
WHERE ID IN
(
    SELECT ID FROM
    (
        SELECT 
          ID,
          130 - x_value xdiff,
          y_value - 130 ydiff
        FROM Table1
        ORDER BY xdiff ASC LIMIT 1
    ) t
)

这会给你:

ID    X_VALUE    Y_VALUE
3       120       190

SQL 小提琴演示

于 2012-11-05T13:47:23.550 回答
2

刚刚修改了 Mahmoud Gamal 的查询来解决问题:

SELECT * 
FROM Table1
WHERE ID IN
(
 SELECT ID FROM
  (
SELECT 
  ID,
  CASE
WHEN (130 - x_value > y_value - 130) THEN y_value - 130
ELSE 130 - x_value
END
FROM Table1
 where 130>=x_value and 130<=y_value
ORDER BY 2 ASC LIMIT 1
    )t)

在这里查看:http ://www.sqlfiddle.com/#!2/117a0/1

于 2012-11-05T14:10:28.960 回答
0
select * 
from yourtable
order by case when ABS(x-130)<ABS(y-130) then ABS(x-130) else ABS(y-130) end
limit 1

或者

select id
from
(select id,x from yourtable union select id,y from yourtable) v
order by ABS(x-130) 
limit 1
于 2012-11-05T14:01:46.490 回答