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 18th
、1610924400000
的值,我将需要获得单个 pricelist_id
值,在本例中为 3
.
如果我传递一个代表 Jan 16th 17:15:00
、1610813700000
的值,我将需要获得单个 pricelist_id
值,在本例中为 2
.
如果我传递一个代表 Jan 25th
、1611529200000
的值,我将需要获得单个 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_id
与 valid_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
我将尝试通过示例来解释我想在 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 18th
、1610924400000
的值,我将需要获得单个 pricelist_id
值,在本例中为 3
.
如果我传递一个代表 Jan 16th 17:15:00
、1610813700000
的值,我将需要获得单个 pricelist_id
值,在本例中为 2
.
如果我传递一个代表 Jan 25th
、1611529200000
的值,我将需要获得单个 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_id
与 valid_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