如果我有这样一个查询:
select * from tbl_foo where name = 'sarmen'
这个表中有多个name = sarmen的实例,如何为每一行虚拟分配行号而不必创建一个自动递增列?我在做这件事情时有原因,并且不需要一个自动递增列。如果每一行都通过SQL或者PHP分配一个虚拟行号,那么我随时可以打印出第一行或最后一行。
谢谢。
如果我有这样一个查询:
select * from tbl_foo where name = 'sarmen'
这个表中有多个name = sarmen的实例,如何为每一行虚拟分配行号而不必创建一个自动递增列?我在做这件事情时有原因,并且不需要一个自动递增列。如果每一行都通过SQL或者PHP分配一个虚拟行号,那么我随时可以打印出第一行或最后一行。
谢谢。
要仅返回一行,请使用 LIMIT 1
:
SELECT *
FROM tbl_foo
WHERE name = 'sarmen'
LIMIT 1
如果没有 ORDER BY
子句,那么说“第一行”或“最后一行”就没有意义。假设您添加了 ORDER BY
子句,则可以按以下方式使用 LIMIT:
LIMIT 1
。LIMIT 1, 1
。LIMIT 1
。您没有说明订单如何确定,但是这将为您在MySQL中提供排名值:
SELECT t.*,
@rownum := @rownum +1 AS rank
FROM TBL_FOO t
JOIN (SELECT @rownum := 0) r
WHERE t.name = 'sarmen'
SELECT COUNT(*) FROM tbl_foo WHERE name = 'sarmen'
有了计数,现在可以使用以下方法获取第n行:
SELECT * FROM tbl_foo WHERE name = 'sarmen' LIMIT (n - 1), 1
第一个查询中的 COUNT(*) 的结果为 n,其中 1 <= n <= 该查询结果的总行数。
示例:
获取第三行。
SELECT * FROM tbl_foo WHERE name = 'sarmen' LIMIT 2, 1
name
列上存在索引,你提供的查询可以使用该索引来使得使用name
列的查询更加高效。 - OMG Ponies