43

理想情况下,我需要一个等效于的查询

select * from customer where row_number() = 3

但这是非法的。

我不能使用自动递增的字段。

row_number() 是需要选择的行。

我该怎么做?

编辑:嗯,我使用 iSql*plus 来练习,由于某种原因,使用 limit 和 auto_increment 是非法的。我最终创建了一个序列和一个触发器,并且每次有一个条目时都将 id 增加 1。

4

6 回答 6

98

您可以使用LIMIT 2,1而不是WHERE row_number() = 3.

正如文档所解释的,第一个参数指定要返回的第一行的偏移量,第二个参数指定要返回的最大行数

请记住,它是一个基于 0 的索引。所以,如果你想要行号n,第一个参数应该是n-1。第二个参数将始终为1,因为您只想要一行。例如,如果您想要表格的第56customer行:

SELECT * FROM customer LIMIT 55,1
于 2012-05-04T23:47:19.430 回答
8

你不能像那样选择一行。您必须指定一个值为3的字段

这是一个有效的查询,如果您要比较的字段是id

select * from customer where `id` = 3
于 2012-05-04T23:48:17.077 回答
6
SET @customerID=0;
SELECT @customerID:=@customerID+1 AS customerID
FROM CUSTOMER ;

您可以像这样从 SQL 获取数据集并将其填充到 java 数据结构(如 List)中,然后在那里进行必要的排序。(也许在类似界面的帮助下)

于 2012-05-04T23:54:22.767 回答
2

默认情况下,SQL 表没有排序,并且从无序的行集中询问第 n 行没有任何意义,因为它每次都可能返回不同的行,除非您指定 ORDER BY:

select * from customer order by id where row_number() = 3

(有时 MySQL 表以内部顺序显示,但您不能依赖这种行为)。然后您可以使用LIMIT offset, row_count, 与基于 0 的偏移量,因此行号 3 变为偏移量 2:

select * from customer order by id
limit 2, 1

或者您可以使用LIMIT row_count OFFSET offset

select * from customer order by id
limit 1 offset 2
于 2017-06-22T05:00:39.017 回答
1

您的表需要使用唯一的 ID 字段创建,理想情况下该字段应具有 AUTO_INCREMENT 属性。例子:

CREATE TABLE Persons
(
P_Id int NOT NULL AUTO_INCREMENT,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
PRIMARY KEY (P_Id)
)

然后您可以使用以下命令访问此表中的第三条记录:

SELECT * FROM Persons WHERE P_Id = 3
于 2012-05-04T23:53:25.697 回答
1

您可以在表中添加自动生成的 id 字段并通过此 id 选择

SELECT * FROM CUSTOMER WHERE CUSTOMER_ID = 3;
于 2012-05-04T23:45:49.790 回答