【问题标题】:MySQL Get the first record in the last 10 recordsMySQL获取最后10条记录中的第一条记录
【发布时间】:2019-12-28 22:20:04
【问题描述】:

在 Mysql 中,我试图获取最近 10 条记录中最旧的记录。

要获得最后 10 个,我只需这样做 SELECT * FROM table ORDER BY id DESC LIMIT 10;

要获得最旧的,我只需使用 ASC 顺序。

我需要先按 DESC 排序以获取最后 10 个,然后按 ASC 排序以获取该数组的第一条记录。 我将使用哪个查询以 DESC 顺序获取第 10 行,即最新的 10 个中最旧的?

【问题讨论】:

    标签: mysql


    【解决方案1】:

    使用[LIMIT {[offset,] row_count] 概念:

    SELECT * FROM table 
    ORDER BY id 
    DESC LIMIT 9, 1
    

    这里,OFFSET 为 9 --> 表示第 10 行(按升序排列时,将是最后 10 行中的第一行)。

    【讨论】:

    • 极端情况是 table 至少包含一行但少于 10 行。在这种情况下,此查询不会返回一行。来自@sid 的查询将返回一行。
    • @spencer7593 这种“极端情况”将极为罕见;在这种情况下,最好避免使用基于子查询的解决方案。人们总是可以编写一个额外的查询来处理这种边缘情况,以防没有收到数据,但命中的机会几乎为零。
    • @MadhurBhaiya 在我的特殊情况下,最后 10 个来自另一个查询,因此您的回答简单明了。谢谢
    • 为了未来读者的利益,在更一般的情况下,考虑到也可能存在限制行的 WHERE 条件,并考虑将这种方法推广到“最旧的最新 n 行”,其中 n 可以是 42 或 4200 万。如果规范没有明确说明一个案例(当行数少于 n 时应该返回什么),我认为我们应该包含一个说明,以澄清规范的解释。不管一个案例有多“罕见”,行为都应该被很好地定义,并与规范相匹配。不返回一行可能满足要求。
    【解决方案2】:

    使用子查询仅选择 1 个

    SELECT * FROM ( SELECT * FROM ORDER BY id DESC LIMIT 10 ) order by id ASC LIMIT 1 ;
    

    【讨论】:

    • 如果“最新十行”少于十行怎么办?是要求返回找到的最旧的行,还是不应该返回任何行? (此答案中的查询满足规范的一种解释。)+10
    • 如果行数少于 10 行,这仍然有效。假设只有 5 行,但由于限制为 10 没有偏移,它会将所有记录拉到 10
    • 无论如何,即使行数少于 10,也有 100% 的机会这样做
    • 这真的取决于规定应该返回什么的期望的规范。如果满足要求,不返回行的查询也可以被视为“工作”。对所提出问题的更完整答案将解决规范的两种解释,至少提及其他可能的解释。
    • 那为什么不联系OP,这里的答案只是提供解决方案的个人意见
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    • 2017-05-08
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    相关资源
    最近更新 更多