如何获取MySQL查询返回的行数?分页场景下的正确实现
正确实现方式
你的问题出在错误地将count(*)与查询字段直接拼接,语法和逻辑都不成立。下面是两种可行的实现方案:
方案一:先查总行数,再分页取数据
1. 获取总行数
你的原查询是从videoname表读取所有行(无过滤条件),因此总行数就是videoname表的记录数,直接执行:
SELECT COUNT(*) AS total_rows FROM videoname;
如果后续原查询添加了WHERE过滤条件,记得把相同条件同步到这个统计语句中。
2. 分页获取数据
用LIMIT和OFFSET实现分页,每次取50条,示例(第一页):
SELECT mv.id, mv.songname, mv.slug, (SELECT COUNT(*) FROM clickedsongname WHERE clickedsongname.songid = mv.id) AS click_count FROM videoname mv LIMIT 50 OFFSET 0;
- 第二页把
OFFSET改成50,第三页100,以此类推,通用公式为OFFSET (页码-1)*50。
方案二:一次查询同时获取当前页数据和总行数
如果想在单次查询中既拿到当前页的歌曲数据,又得到总记录数,可以用窗口函数COUNT(*) OVER():
SELECT id, songname, slug, click_count, total_rows FROM ( SELECT mv.id, mv.songname, mv.slug, (SELECT COUNT(*) FROM clickedsongname WHERE clickedsongname.songid = mv.id) AS click_count, COUNT(*) OVER() AS total_rows FROM videoname mv ) AS temp_result LIMIT 50 OFFSET 0;
这种方式会让当前页的每一行都带上总记录数,前端可直接用该数值计算分页总数。
原有写法的问题
你之前的两个写法都存在语法错误:count(*)后未加逗号就直接跟mv.id,数据库无法识别该语法。即便修正语法,直接将count(*)与其他字段放在一起查询,数据库只会返回一行数据——count(*)是总记录数,但其他字段仅会取表中第一行的值,完全不符合你统计总行数同时保留原查询结构的需求。
内容的提问来源于stack exchange,提问作者Jake Dawsen
相关产品推荐
相关产品推荐

