gpt4 book ai didi

mysql - 如何选择除前 3 条记录以外的所有记录?

转载 作者:行者123 更新时间:2023-11-29 01:22:40 25 4
gpt4 key购买 nike

我有专栏

id
-----
1
32
3
6
5
22
54
21

问题 1:如何从列中选择除前 3 条记录以外的所有记录?
问题2:如何选择最后3条记录?

-谢谢。

最佳答案

您基本上需要将此类查询放入stored procedures 中由于对 LIMIT 的一些限制.您不能在纯 sql 中使用子选择或变量。在存储过程中,您可以使用变量。

这有效,不幸的是我不能在 sqlfiddle 中显示它因为他们似乎对存储过程的支持有限。

drop procedure if exists all_but_3;

delimiter //
create procedure all_but_3()
begin
declare v_max bigint unsigned default ~0;
select * from your_table limit 3, v_max;
end//

delimiter ;

drop procedure if exists last_3;
delimiter //
create procedure last_3()
begin
declare v_max bigint;
declare v_mid bigint;
select count(*) from your_table into v_max;
set v_mid := v_max - 3;
select * from your_table limit v_mid, v_max;
end//

delimiter ;

call all_but_3();
call last_3();

InnoDB聚簇索引详解

在与@fthiella 讨论其他答案之一后,我决定详细说明其工作原理。

使用 InnoDB 作为引擎的表将始终具有聚簇索引。总是。这就是数据存储在 InnoDB 中的方式,并且在没有聚集索引的情况下不可能以任何方式创建表。

如果存在一个或第一个所有列都设置为非空的唯一索引,InnoDB 将选择主键。如果不存在这样的索引,InnoDB 将创建一个带有行 ID 的隐藏列。此行 ID 的工作方式类似于自动递增,如果可以将其视为具有自动递增的不可见列,我认为这很好。

InnoDB 将进一步根据使用的索引返回行。它将始终使用一些索引(检索数据的唯一方法是使用二级索引、聚簇索引或组合索引),因此在没有显式创建的索引的情况下,隐藏的聚簇索引返回行。

这意味着针对没有主键和唯一索引且所有列都设置为非空且没有 ORDER BY 的表的查询将按照插入顺序返回行。

这个问题就是这种情况,也是我和许多其他答案的基础。

我并不是说这是处理数据的好方法。在使用此解决方案之前,您应该考虑以下事项:

  • 如果创建了可用作聚簇索引的索引,则将重写该表以使用该索引,并通过这样做对磁盘上的数据进行排序。如果稍后删除索引,原始插入顺序将丢失且无法检索。
  • 如果创建了索引,即使它不是唯一的,优化器也可以选择使用它,并且行将按该索引排序。

所有这些都记录在案,对于 5.5,它是 this page 上的第三个要点。

关于mysql - 如何选择除前 3 条记录以外的所有记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14080198/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com