Mysql 在限制之前,如何计算匹配行的数量?

Mysql 在限制之前,如何计算匹配行的数量?,mysql,sql,algorithm,Mysql,Sql,Algorithm,这是我最初的疑问: SELECT u.id user_id, u.avatar, u.date_time, CONCAT(u.user_fname, ' ', u.user_lname) name, sum($this->table_alias.vote_value) vote_value, sum($this->table_alias.score) score, $category_in_the_s

这是我最初的疑问:

SELECT u.id user_id,
       u.avatar,
       u.date_time,
       CONCAT(u.user_fname, ' ', u.user_lname) name,
       sum($this->table_alias.vote_value) vote_value,
       sum($this->table_alias.score) score,
       $category_in_the_select AS tc $tag_in_the_select AS tt
FROM users u
JOIN reputations $this->table_alias ON u.id = $this->table_alias.owner_id $query_join
WHERE $time_limitation $query_where
GROUP BY user_id, u.avatar, u.date_time, name, tc, tt
ORDER BY score DESC, vote_value DESC
LIMIT :j, $this->per_page
它也可以工作,并返回预期的结果。现在我还想计算限制前的总行数。这是我的新查询,似乎有效。我的意思是,我不确定它是否正常工作,但测试表明它正常工作:

SELECT x.*, @cnt cnt
FROM
  (SELECT (@cnt := @cnt + 1) total,
          u.id user_id,
          u.avatar,
          u.date_time,
          CONCAT(u.user_fname, ' ', u.user_lname) name,
          sum($this->table_alias.vote_value) vote_value,
          sum($this->table_alias.score) score,
          $category_in_the_select AS tc $tag_in_the_select AS tt
   FROM users u
   CROSS JOIN
     (SELECT @cnt := 0) params
   JOIN reputations $this->table_alias ON u.id = $this->table_alias.owner_id $query_join
   WHERE $time_limitation $query_where
   GROUP BY user_id, u.avatar, u.date_time, name, tc, tt
   ORDER BY total) x
ORDER BY x.score DESC, x.vote_value DESC
LIMIT :j, $this->per_page
如您所见,在应用
LIMIT
子句之前,我使用了变量来计算结果

注意,我的方法比
FOUND\u ROWS()
函数快两倍。总之,我想知道的是,我的方法正确吗?或者没有任何保证,我不能依赖它


再一次,我已经测试了它,显然工作正常

是的,你的方法是有效的,但是你确定你正确地测量了时间吗?是否必须首先将数据读入缓冲池?我发现很难相信,
found\u rows()
方法比您的解决方案花费的时间更长。是的,您的方法有效,但您确定您正确测量了时间吗?是否必须首先将数据读入缓冲池?我很难相信,
found\u rows()
方法比您的解决方案花费的时间更长。