如果我有查询,例如
select * from tbl_foo where name = 'sarmen'
并且这个表有多个name = sarmen的实例我怎样才能为每行虚拟分配行号而不必创建一个自动执行的列?我有一个原因,我在做什么,在我的例子中不需要auto_incrimented col。
所以,如果每一行都通过sql或者php分配一个虚拟行号,我将能够随时打印出第一行或最后一行。
日Thnx
答案 0 :(得分:28)
要仅返回一行,请使用LIMIT 1
:
SELECT *
FROM tbl_foo
WHERE name = 'sarmen'
LIMIT 1
除非您有ORDER BY
子句,否则说“第一行”或“最后一行”是没有意义的。假设您添加了ORDER BY
子句,则可以通过以下方式使用LIMIT:
LIMIT 1
。LIMIT 1, 1
。LIMIT 1
。答案 1 :(得分:5)
您没有指定如何确定订单,但这将为您提供MySQL中的排名值:
SELECT t.*,
@rownum := @rownum +1 AS rank
FROM TBL_FOO t
JOIN (SELECT @rownum := 0) r
WHERE t.name = 'sarmen'
然后,您可以根据排名值选择所需的行。
答案 2 :(得分:1)
您可以使用以下方式获取包含特定名称的总行数:
SELECT COUNT(*) FROM tbl_foo WHERE name = 'sarmen'
鉴于计数,您现在可以使用以下方式获取第n行:
SELECT * FROM tbl_foo WHERE name = 'sarmen' LIMIT (n - 1), 1
第一次查询中1< = n< = COUNT(*)。
示例强>:
获得第3行
SELECT * FROM tbl_foo WHERE name = 'sarmen' LIMIT 2, 1