具有 LIMIT 的查询的 Count(*)

Count(*) of a query having a LIMIT

我有这个 SQL 查询:

SELECT users.*, users_oauth.* FROM users LEFT JOIN users_oauth ON users.user_id = users_oauth.oauth_user_id WHERE (
(MATCH (user_email, user_firstname, user_lastname) AGAINST ('"+smith "+john"' IN BOOLEAN MODE)) ) 
ORDER BY user_date_accountcreated DESC LIMIT 0,50

有没有什么方法可以让这个查询的 COUNT(*) 忽略同一个查询中的 LIMIT 0,50 ? 或者我是否必须执行 2 个查询,一个查询结果,一个查询 COUNT(*)?

谢谢。

如果您需要在每一行上重复计数 (*),那么限制不是问题您可以添加一个包含相关查询的列

SELECT users.*, users_oauth.* , (select count(*) FROM users 
        LEFT JOIN users_oauth ON users.user_id = users_oauth.oauth_user_id 
        WHERE (
          (MATCH (user_email, user_firstname, user_lastname) AGAINST ('"+smith "+john"' IN BOOLEAN MODE)) ) )
FROM users 
LEFT JOIN users_oauth ON users.user_id = users_oauth.oauth_user_id 
WHERE (
  (MATCH (user_email, user_firstname, user_lastname) AGAINST ('"+smith "+john"' IN BOOLEAN MODE)) ) 
ORDER BY user_date_accountcreated DESC LIMIT 0,50

但如果您只想将计数 (*) 添加到某些 mysql 版本中选择的列,您只会得到一行 在其他情况下你有错误,因为混合聚合函数和单列没有声明 group by 子句

如果您的 MariaDB 版本是 10.2.0+,则支持 window 函数,您可以使用 COUNT(*) OVER ():

SELECT 
  users.*, 
  users_oauth.*,
  COUNT(*) OVER () AS countall
FROM users 
LEFT JOIN users_oauth ON users.user_id = users_oauth.oauth_user_id 
WHERE 
  MATCH (user_email, user_firstname, user_lastname) AGAINST ('"+smith "+john"' IN BOOLEAN MODE)
ORDER BY user_date_accountcreated DESC 
LIMIT 0,50

如果您的 MariaDB 版本是 10.2.0-(在此之前),您可以在列中使用嵌套 select:

SELECT 
  users.*, 
  users_oauth.*,
  (SELECT count(*)
   FROM users 
   LEFT JOIN users_oauth ON users.user_id = users_oauth.oauth_user_id 
   WHERE MATCH (user_email, user_firstname, user_lastname) AGAINST ('"+smith "+john"' IN BOOLEAN MODE)
  ) AS countall
FROM users 
LEFT JOIN users_oauth ON users.user_id = users_oauth.oauth_user_id 
WHERE 
  MATCH (user_email, user_firstname, user_lastname) AGAINST ('"+smith "+john"' IN BOOLEAN MODE)
ORDER BY user_date_accountcreated DESC 
LIMIT 0,50