Select 第一个最大值使用 MySQL 中的 TOP 1?

Select first largest value using TOP 1 in MySQL?

我将尝试通过示例来解释我想在 MySQL 中实现的目标。

我有一个 table 看起来像这样:

pricelist_id valid_from
1           1610665200000 //15 Jan 2021
2           1610751600000 //16 Jan 2021         
3           1610838000000 //17 Jan 2021

valid_from 中的值本质上是字符串值,它们是在某个时间点通过以下 Java 代码生成的:

String.valueOf(System.currentTimeMillis())

我的任务是传递任何字符串值(以数字格式,在本例中为 long),生成方式与上述相同,我需要提取单个 pricelist_id与传递的值 valid_from 相比,它属于 table 中第一个小于或等于 valid_from 的值。很难用文字来解释(而且我的英语很糟糕),所以我来演示一下。

如果我传递一个代表 Jan 18th1610924400000 的值,我将需要获得单个 pricelist_id 值,在本例中为 3.

如果我传递一个代表 Jan 16th 17:15:001610813700000 的值,我将需要获得单个 pricelist_id 值,在本例中为 2.

如果我传递一个代表 Jan 25th1611529200000 的值,我将需要获得单个 pricelist_id 值,在本例中为 3.

到目前为止,我得到的是:

select  max(p.pricelist_id)
from pricelist p
where  (p.valid_from + 0) <= some_passed_value
order by p.valid_from, p.pricelist_id desc

如果您可以相信 pricelist_idvalid_from 的排序顺序完全相同,那么您使用 max() 的解决方案就可以了。

否则你可以使用 LIMIT:

select  p.pricelist_id
from pricelist p
where  (p.valid_from + 0) <= some_passed_value
order by p.valid_from, p.pricelist_id desc
limit 1

将字符串转换为数字以进行排序和比较 也使用 limit 来获得更高的值

select p.pricelist_id 来自价目表 p 其中 CONVERT(p.valid_from, SIGNED) <= some_passed_value 按 CONVERT(p.valid_from, SIGNED), p.pricelist_id desc 命令排序 限制 0, 1