【问题标题】:Count from a table, but stop counting at a certain number从表格中计数,但在某个数字处停止计数
【发布时间】:2010-12-18 04:30:04
【问题描述】:

MySQL 中是否有办法从表中获取COUNT(*),如果该表的数字大于x,它将在那里停止计数?基本上,我只想知道从查询返回的记录数是否大于或小于特定数字。如果超过这个数字,我真的不在乎有多少行,如果更少,告诉我计数。

我已经能够像这样捏造它:

-- let x be 100

SELECT COUNT(*) FROM (
    SELECT `id` FROM `myTable`
    WHERE myCriteria = 1
    LIMIT 100
) AS temp

...但我想知道是否有一些方便的内置方法可以做到这一点?


感谢您的建议,但我应该更清楚地了解这个问题背后的原因。它从几个连接表中进行选择,每个表都有数千万条记录。使用索引条件运行COUNT(*) 仍然需要大约 80 秒,而运行没有索引的条件大约需要 30 分钟左右。更多的是优化查询而不是获得正确的输出。

【问题讨论】:

  • 恐怕在这种情况下检查 COUNT( ) > 100 或 COUNT( ) > 1000 或 COUNT( ) > 10000 不会有任何区别。
  • 是的,我知道,这就是我使用 LIMIT 进行子查询的原因,我想知道是否有更好的方法
  • 当我看到您的编辑/意图时,我删除了我的答案。我想你在你的问题中的答案是最优化的

标签: mysql sql database count query-optimization


【解决方案1】:
SELECT * FROM WhateverTable WHERE WhateverCriteria
LIMIT 100, 1

LIMIT 100, 1 返回第 101 条记录,如果有,否则没有记录。如果有帮助,您也许可以将上述查询用作 EXIST 子句中的子查询。

【讨论】:

  • 这对我来说不合适。这不会只包括出现超过 100 次的 ID 吗?如果每个 ID 都是唯一的,那么祝你好运!
  • 我已经编辑了帖子。 “HAVING”与“GROUP BY”一起使用,在这种情况下不需要“GROUP BY”。
  • 感谢 Salman -- 我已经更新了我的问题以更好地解释我的情况。
  • 我知道我在这里玩游戏晚了几年,但我想提一下,这确实是一个很好的解决方案。谢谢!
【解决方案2】:

我什么都想不出来。在我看来,您所做的事情完全符合目的,而且 SQL 似乎并没有竭尽全力让您更简洁地做到这一点。

考虑一下:在严格的集合算术上下文中,您尝试做的事情是没有意义的。从数学上讲,答案是计算所有内容,然后将 MIN() 设为 100,这是您(务实且有充分理由)试图避免的。

【讨论】:

    【解决方案3】:

    这行得通:

    select count(*) from ( select * from  stockinfo s limit 100 ) s
    

    但并没有更快(我可以说):

    select count(*) from stockinfo
    

    返回 5170965。

    【讨论】:

    • 来自手册:如果 SELECT 从一个表中检索,没有检索到其他列,并且没有 WHERE 子句,则 COUNT(*) 被优化为非常快速地返回。此优化仅适用于 MyISAM 表,因为为此存储引擎存储了准确的行数,并且可以非常快速地访问。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-17
    • 1970-01-01
    • 2017-12-29
    • 2017-11-22
    • 2022-01-15
    • 2020-10-01
    相关资源
    最近更新 更多