MySQL - 如何只选择具有相同字段值的前 X 行?

标签 mysql datetime limit

这是一个描述日历中事件的简单表格:

Event
--------------------
Id      int
DayId   int         # Foreign key to Day table
Title   varchar(32)
Start   datetime
Finish  datetime

以及获取一些结果集的任意 SELECT 语句:

select
    Id,
    DayId,
    Title,
    Start,
    Finish
from Event
where Start > now()
order by Start

上面的选择查询将在以后返回所有 事件,这是不可取的。但是使用 limit 意味着您需要知道要限制的数量。

我希望能够选择具有相同 DayId 值的前 X 行


一些例子有助于更好地解释这种情况:

示例结果:

Id: 26,   DayId: 08,   Title: "Foo",    Start: "2012-03-19 23:00:00"
Id: 27,   DayId: 08,   Title: "Bar",    Start: "2012-03-20 00:00:00"
Id: 28,   DayId: 09,   Title: "Baz",    Start: "2012-03-21 09:00:00"
Id: 29,   DayId: 10,   Title: "Barbaz", Start: "2012-03-22 11:00:00"
Id: 30,   DayId: 09,   Title: "Fooboo", Start: "2012-03-25 15:00:00"

假设上面的查询返回了这样的结果集,我正在寻找的查询将只返回前两行,因为它们是下一次发生的具有相同的事件DayId.

但是,在 3 月 19 日之后,Start > now() 条件将返回不同的结果集:

Id: 28,   DayId: 09,   Title: "Baz",    Start: "2012-03-21 09:00:00"
Id: 29,   DayId: 10,   Title: "Barbaz", Start: "2012-03-22 11:00:00"
Id: 30,   DayId: 09,   Title: "Fooboo", Start: "2012-03-25 15:00:00"

在这种情况下,结果应该只返回第一个 行。请注意(出于解释目的)最后一个结果确实具有相同的 DayId,但由于它由不同的 DayId 分隔,因此应忽略它。

最佳答案

这可能不是实现预期结果的最佳方式,但它会起作用:

select
    Id,
    DayId,
    Title,
    Start,
    Finish
from Event
where Start > now(), AND DayId IN (SELECT DayId FROM Event WHERE Start > now() ORDER BY Start)
order by Start

刚刚意识到您不能在子查询上使用 LIMIT,现在这个答案不起作用

关于MySQL - 如何只选择具有相同字段值的前 X 行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9761340/

相关文章:

mysql - MySQL 中的二进制数据

java - 如何向mysql数据库中添加10000行数据

php - 在php中找到特定日期/时间的最大和最小可能值

linux - 每个驱动器的最大文件数

mysql - 当我在 MySQL 的数百万条记录和数千条记录中使用 LIMIT 子句时,它的效率是否相同?

php - 使用 PHP 和 MySQL 存储用户图像的最佳方式是什么?

mysql - 不使用 MySQL Workbench 创建新数据库

python - 使用python格式化日期

mysql 数据库获取时间-温度值

C - 超过字符限制 - 标准规则