Mysql SQL-查找与给定参数最接近的价格
我试图找到最接近SQL中给定参数的价格元组。 例如:参数price=6将返回id 1和2。 参数price=20将返回id 3 表:Mysql SQL-查找与给定参数最接近的价格,mysql,sql,database,db2,Mysql,Sql,Database,Db2,我试图找到最接近SQL中给定参数的价格元组。 例如:参数price=6将返回id 1和2。 参数price=20将返回id 3 表: ID PRICE 1 5 2 5 3 10 SELECT id FROM Table WHERE table.price ?? 6 有什么办法吗 多谢各位 SELECT ID FROM TableX WHERE PRICE = @CheckPrice + ( SELECT MIN(ABS(PRICE - @C
ID PRICE
1 5
2 5
3 10
SELECT id
FROM Table
WHERE table.price ?? 6
有什么办法吗
多谢各位
SELECT ID
FROM TableX
WHERE PRICE = @CheckPrice +
( SELECT MIN(ABS(PRICE - @CheckPrice))
FROM TableX
)
OR PRICE = @CheckPrice -
( SELECT MIN(ABS(PRICE - @CheckPrice))
FROM TableX
)
或者性能可能更好:
SELECT ID
FROM
TableX
CROSS JOIN
( SELECT
( SELECT MIN(PRICE) - @CheckPrice
FROM TableX
WHERE PRICE >= @CheckPrice
) AS Pover
, ( SELECT @CheckPrice - MAX(PRICE)
FROM TableX
WHERE PRICE <= @CheckPrice
) AS Punder
FROM dual
) AS tmp
WHERE PRICE IN ( @CheckPrice + LEAST(Pover, Punder)
, @CheckPrice - LEAST(Pover, Punder)
)
或者性能可能更好:
SELECT ID
FROM
TableX
CROSS JOIN
( SELECT
( SELECT MIN(PRICE) - @CheckPrice
FROM TableX
WHERE PRICE >= @CheckPrice
) AS Pover
, ( SELECT @CheckPrice - MAX(PRICE)
FROM TableX
WHERE PRICE <= @CheckPrice
) AS Punder
FROM dual
) AS tmp
WHERE PRICE IN ( @CheckPrice + LEAST(Pover, Punder)
, @CheckPrice - LEAST(Pover, Punder)
)
此查询使用子查询选择最接近的价格,然后返回与该价格匹配的所有行:
SELECT *
FROM Table
WHERE price = ( --could also use "WHERE price in" here...
SELECT TOP 1 price FROM Table
GROUP BY price
ORDER BY Min(Abs(price - ?)))
此查询使用子查询选择最接近的价格,然后返回与该价格匹配的所有行:
SELECT *
FROM Table
WHERE price = ( --could also use "WHERE price in" here...
SELECT TOP 1 price FROM Table
GROUP BY price
ORDER BY Min(Abs(price - ?)))
我们使用UNION子查询来获取目标价格的最接近价格。 在每个子查询中,我们得到每个模型价格和目标价格之间的绝对差值,最后按差值排序。工作非常快速和稳定。希望有帮助
SET @CheckPrice = 3910;
(
SELECT
m_id,
m_name,
m_auto_price,
m_auto_discount,
ABS(m_auto_price - @CheckPrice)AS delta
FROM
s_models
WHERE
m_auto_price >= @CheckPrice
ORDER BY
m_auto_price ASC
LIMIT 10
)
UNION
(
SELECT
m_id,
m_name,
m_auto_price,
m_auto_discount,
ABS(m_auto_price - @CheckPrice)AS delta
FROM
s_models
WHERE
m_auto_price <= @CheckPrice
ORDER BY
m_auto_price DESC
LIMIT 10
)
ORDER BY
delta ASC,
m_auto_price DESC,
m_auto_discount DESC
我们使用UNION子查询来获取目标价格的最接近价格。 在每个子查询中,我们得到每个模型价格和目标价格之间的绝对差值,最后按差值排序。工作非常快速和稳定。希望有帮助
SET @CheckPrice = 3910;
(
SELECT
m_id,
m_name,
m_auto_price,
m_auto_discount,
ABS(m_auto_price - @CheckPrice)AS delta
FROM
s_models
WHERE
m_auto_price >= @CheckPrice
ORDER BY
m_auto_price ASC
LIMIT 10
)
UNION
(
SELECT
m_id,
m_name,
m_auto_price,
m_auto_discount,
ABS(m_auto_price - @CheckPrice)AS delta
FROM
s_models
WHERE
m_auto_price <= @CheckPrice
ORDER BY
m_auto_price DESC
LIMIT 10
)
ORDER BY
delta ASC,
m_auto_price DESC,
m_auto_discount DESC
非常感谢。我已经很久没有用过Sql了,谢谢。自从我使用sqlThis已经有很长一段时间了。只有当MinAbprice-@CheckPrice恰好与数据库中已有的价格匹配时,它才会返回行。在问题中的示例中,MinAbsprice-6的计算结果为1,它不会出现在价格列中,因此不会返回任何行。只有当MinAbsprice-@CheckPrice恰好与数据库中已有的价格完全匹配时,才会返回行。在问题中的示例中,MinAbsprice-6的计算结果为1,它不会出现在price列中,因此不会返回任何rows.Nice。但是,如果价格为5,5,7,并且您检查了6,结果将是价格为5的ID或价格为7的ID或多或少随机。我同意它排除了价格等距的情况,但它将始终返回更高的价格,因为ORDER BY-而不是像您建议的那样随机。ORDER BY是在ABS调用之后完成的,因此,我坚持认为,前1名将是一个相当随机的选择。@ypercube OK,我确实明白您的推理,但我只是在SqlServer中设置了它,而不是在MySql中,并且无论将记录插入到表中的顺序如何,或者有多少记录在参数上/下,都会得到相同的一致结果。我猜这和默认的排序顺序有关?可能吧。我现在也不能办理登机手续。很好。但是,如果价格为5,5,7,并且您检查了6,结果将是价格为5的ID或价格为7的ID或多或少随机。我同意它排除了价格等距的情况,但它将始终返回更高的价格,因为ORDER BY-而不是像您建议的那样随机。ORDER BY是在ABS调用之后完成的,因此,我坚持认为,前1名将是一个相当随机的选择。@ypercube OK,我确实明白您的推理,但我只是在SqlServer中设置了它,而不是在MySql中,并且无论将记录插入到表中的顺序如何,或者有多少记录在参数上/下,都会得到相同的一致结果。我猜这和默认的排序顺序有关?可能吧。我现在也不能办理登机手续。