具有 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
我有这个 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