我在registrations
表上有10,000个用户,并希望从我的应用程序中将此查询限制为3500个用户。但是,当我调查日志时,有时计数超过3500。我不明白为什么该查询返回的值超出限制:
select count(*)
from registrations
where (selectedtime IS NULL
AND expirationtime < NOW()
)
LIMIT 3500;
我在数据库上手动尝试过,发现有时超过3500
答案 0 :(得分:1)
您的查询仅返回1行,该行少于3500。
如果要限制要计数的行数,则需要将其放入子查询中。
SELECT COUNT(*)
FROM (
SELECT 1
FROM registrations
WHERE selectedtime IS NULL AND expirationtime < NOW()
LIMIT 3500) AS x
答案 1 :(得分:0)
带有COUNT的SELECT语句返回SELECT语句检索的行数。
出于性能原因,所需的结果是限制该计数。 在SELECT语句中包含LIMIT子句将不起作用,因为它仅限制返回的行数,始终为1。
该解决方案(我称为“有限计数”)是通过限制非计数SELECT语句并将其包装在COUNT(*)中来完成的。
例如: 如果您的count语句看起来像
select count(*) from registrations where (selectedtime IS NULL AND expirationtime < NOW()) LIMIT 3500;
您可以通过将查询替换为以下内容来限制结果:
SELECT COUNT(*) AS total
FROM (
SELECT 1
FROM registrations
WHERE selectedtime IS NULL AND expirationtime < NOW()
LIMIT 3500) AS x
如果您需要知道不带LIMIT的非计数SELECT语句将返回多少行,则可以使用信息函数FOUND_ROWS()。它将获取总行数,而无需再次运行该语句。
答案 2 :(得分:0)
这就是您所做的 :
select count(*)
from registrations
where (selectedtime IS NULL
AND expirationtime < NOW()
)
LIMIT ROWS EXAMINED 3500;
(自MariaDB 5.5.21起可用-参见https://mariadb.com/kb/en/library/limit-rows-examined/)