从MySQL表中选择特定行

45

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

select * from customer where row_number() = 3

但那是非法的。

我不能使用自增字段。

row_number() 是需要被选择的行。

我该怎么做呢?

编辑:好吧,我使用 iSql*plus 来练习,由于某些原因,限制和自增是非法的。最后,我创建了一个序列和一个触发器,并在每次有条目时将 ID 增加 1。


2
row_number()是什么意思?MySQL中的记录没有排序。您需要根据它们的内容以其他方式识别所需的数据。 - eggyal
1
@eggyal:标准的 ANSI SQL 有 row_number() 函数(尽管 Marlon 的用法是不正确的),但 MySQL 不支持它(就像许多其他现代 SQL 功能一样)。 - user330315
6个回答

109

你可以使用LIMIT 2,1代替WHERE row_number() = 3

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

请记住这是从零开始编号。因此,如果您想要第n行,第一个参数应该是n-1。第二个参数将始终为1,因为您只需要一行。例如,如果要获取表格customer中的第56行:

SELECT * FROM customer LIMIT 55,1

1
LIMIT 和这个问题有什么关系? - Starx
3
如果@MarlonBrando只想要他的结果的第三行,而不考虑任何技术ID,那么“LIMIT”就是解决方案。 - sp00m
这确实可行,也是问题的解决方案 ;) - nawfal
1
@nawfal,row_number() = 3 LIMIT 3,1 如何返回有效结果? - Starx
2
@Starx 当然,你必须从查询中删除 WHERE row_number() = 3 ... - sp00m
1
这对我非常有效。我有一个测验数据库,希望在每个页面上显示表格的每一行,包括问题和答案。下一页按钮可以跟踪页面编号。我的PHP / MySql Limit语句是:LIMIT $ pageNumber,1 - JScarry

8

您不能以这种方式选择一行。您必须指定一个字段,其值将为3

如果您要比较的字段是id,以下查询将起作用。

select * from customer where `id` = 3

6
SET @customerID=0;
SELECT @customerID:=@customerID+1 AS customerID
FROM CUSTOMER ;

您可以像这样从SQL获取数据集,并将其填充到Java数据结构(如List)中,然后在那里进行必要的排序。(可能需要使用Comparable接口进行辅助)。

1
这种方法对于大型数据集来说效率非常低下。 - Joaquín L. Robles

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 行数 OFFSET 偏移量

select * from customer order by id
limit 1 offset 2

1

你可以在表中添加一个自动生成的ID字段,并通过此ID进行选择。

SELECT * FROM CUSTOMER WHERE CUSTOMER_ID = 3;

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接