mysql - 当您不能依赖 ID 按字面顺序排列时,如何批处理 SELECT 语句?

标签 mysql sql

我所说的字面顺序是指,尽管 ID 是自动递增的,但通过业务逻辑,最终可能会出现 8 出现在 4 之后的情况,而 5 本来应该在那里。也就是说,如果ID发生删除,则不会重新索引

这就是我的行的外观(表名称是 wp_posts):

+-----+-------------+----+--+--+--+
| ID  | post_author | .. |  |  |  |
+-----+-------------+----+--+--+--+
| 4   | ..          |    |  |  |  |
+-----+-------------+----+--+--+--+
| 8   | ..          |    |  |  |  |
+-----+-------------+----+--+--+--+
| 124 | ..          |    |  |  |  |
+-----+-------------+----+--+--+--+
| 672 | ..          |    |  |  |  |
+-----+-------------+----+--+--+--+
| 673 | ..          |    |  |  |  |
+-----+-------------+----+--+--+--+
| 674 | ..          |    |  |  |  |
+-----+-------------+----+--+--+--+

ID是一个int,具有自增特性,但是当帖子被删除时,不会重新分配身份证。它只会被删除,并且因为它是自动递增的,所以您仍然可以假设,在垂直方向上,您正在查看的项目后面的项目总是比之前的项目大。

我正在查询 ID:SELECT ID FROM wp_posts 以获取我需要的所有 ID 的列表。现在,碰巧我需要使用 AJAX 请求对所有这些进行批处理,因为一旦我检索了 ID,我就需要对它们进行操作。

问题是,我不太明白如何将数据传回 AJAX。 LIMIT 的作用是,如果我提供 2 个参数,例如:SELECT ID FROM wp_posts LIMIT 1,3,它将返回 4,8,124 code> 因为它查看行号。但下一次通话时我该怎么办?是的,第一个调用始终以 1 开头,但是一旦我需要启动第二个 AJAX 请求来执行另一个 SELECT,我如何知道应该从哪里开始?就我而言,我想从 4 重新开始,因此,我的第二个查询将是 SELECT ID FROM wp_posts LIMIT 4, 7 等等。

我真的需要发送该计数器(即使我可以自动化它,因为,你看,它是 3 的增量)?

SQL 没有办法自动处理这个问题吗?

最佳答案

你的问题有很多困惑。让我尝试澄清一些基本问题。

首先,自增键是表的主键。您无需担心间隙。其实key应该基本上是没有意义的。它满足以下条件:

  • 保证是唯一的。
  • 保证按插入顺序排列。

间隙是允许的,无需担心。没有重新索引。这是一个坏主意,因为:

  • 主键唯一标识每一行,并且此映射应在不同时间保持一致。
  • 主键在其他表中用于引用值,因此重新索引要么会使这些关系失效,要么需要对许多表进行大量更改。
  • 重新索引预先假定该值具有某种意义,但事实并非如此。

第二个查询,例如:

SELECT ID
FROM wp_posts
LIMIT 1, 3;

可以返回任意三行。为什么?因为您没有指定 ORDER BY,并且没有 ORDER BY 的 SQL 结果集是无序的。没有任何保证。因此,您应该始终养成使用 ORDER BY 的习惯。

第三,如果您想本质上“分页”结果,请使用 LIMIT 中的 OFFSET 功能(如上面所示):

SELECT ID
FROM wp_posts
ORDER BY ID
LIMIT @offset, 3;

这将允许您重置@offset值并转到您想要的行。

关于mysql - 当您不能依赖 ID 按字面顺序排列时,如何批处理 SELECT 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57020684/

相关文章:

mysql - 错误 1005 (HY000) : Can't create table db. #sql-5471_137' (errno: 121)

mysql - 从mysql数据库中删除重复数据

sql - 如何将 Excel 电子表格导入 SQL Server 2008R2 数据库?

sql - sqlite3选择同时引用另一列的列

mysql - SQL 左连接。花费太长时间。

sql - 我如何调试这个 Crystal 报表公式?

mysql - 如果我执行 `WHERE field=1` 和 `WHERE field=' 1'`,为什么 MySQL 会返回两个不同的数据集?

Sql Query - 限制查询结果

mysql - Delphi中从SQL表接收数据

php - 如何将 Flash 与 Php 集成