在应用LIMIT之前,如何计算所选行的总数?

时间:2017-06-09 19:34:34

标签: mysql sql

我有一个几乎复杂的查询:

SELECT    qa.id, 
          qa.subject, 
          qa.category cat, 
          qa.keywords tags, 
          qa.body_html, 
          qa.amount, 
          qa.visibility, 
          qa.date_time, 
          COALESCE(u.reputation, 'N') reputation, 
          COALESCE(Concat(u.user_fname, ' ', u.user_lname), 'unknown') NAME, 
          COALESCE(u.avatar, 'anonymous.png') avatar, 
          ( 
                 SELECT COALESCE(Sum(vv.value),0) 
                 FROM   votes vv 
                 WHERE  qa.id = vv.post_id 
                 AND    15 = vv.table_code) AS total_votes, 
          ( 
                 SELECT COALESCE(Sum(vt.total_viewed),0) 
                 FROM   viewed_total vt 
                 WHERE  qa.id = vt.post_id 
                 AND    15 = vt.table_code limit 1) AS total_viewed 
FROM      qanda qa 
LEFT JOIN users u 
ON        qa.author_id = u.id 
AND       qa.visibility = 1 
WHERE     qa.type = 0 $query_where 
ORDER BY  $query_order
LIMIT     :j, 11;

注意$query_where变量包含将动态创建的其他一些条件。无论如何,如你所见,最多它返回10个帖子。

目前,要计算总匹配行数,我会使用另一个查询:

SELECT COUNT(amount) paid_qs,
       COUNT(*) all_qs
FROM qanda qa
WHERE type = 0 $query_where

我猜有一些废物处理。我的意思是两个分开的查询where子句上的复杂条件)会太多。

是否有任何方法可以使用一个查询而不是它们?

1 个答案:

答案 0 :(得分:4)

您可以使用FOUND_ROWS()函数查询查询后找到的行。

参考:MySQL Reference Manual

您必须在查询中包含SELECT SQL_CALC_FOUND_ROWS ...子句。