You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 21:57:20