select count() 查询中的限制子句未按预期工作

Posted

技术标签:

【中文标题】select count() 查询中的限制子句未按预期工作【英文标题】:limit clause in select count() query is not working as I expected 【发布时间】:2015-06-22 21:18:12 【问题描述】:
$query = $this->db->prepare("SELECT COUNT(id) FROM table WHERE id = ? && UNIX_TIMESTAMP(timestamp) > ? LIMIT 10");
                            $query->bindValue(1, $id);
                            $query->bindValue(2, $timestamp);
                            $query->execute();
                            $count = $query->fetchColumn();
                            var_dump($count);

var_dump($count) 显示的数字高于限制子句。选择计数查询中不能限制结果吗?

【问题讨论】:

没有group by 的聚合函数仅返回一行,因此限制在这里没有帮助。但是,您可以提供一些示例数据和预期输出。 【参考方案1】:

这实际上是您的查询的工作方式,并且是正常行为。使用LIMIT 您将不会限制countsum,而只会限制返回的行。因此,您的查询将返回更多行,如您的 LIMIT 子句中所述。而且由于您的查询实际上只返回所有可能的行,因此应用(非零)限制对结果没有影响。

Limit 只限制一次显示的记录。Count 将返回所有可能的行

【讨论】:

好的,感谢您的澄清,我认为这可能是原因,但找不到任何说明这一点的文档。【参考方案2】:

这个查询:

SELECT COUNT(id)
FROM table
WHERE id = ? && UNIX_TIMESTAMP(timestamp) > ?
LIMIT 10

只返回一行,因为它是一个没有group by 的聚合查询。 limit 并没有真正使用。

也许你想要这个:

SELECT COUNT(id)
FROM (SELECT t.*
      FROM table t
      WHERE id = ? && UNIX_TIMESTAMP(timestamp) > ?
      LIMIT 10
     ) t;

【讨论】:

以上是关于select count() 查询中的限制子句未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

为啥select 子句中的字段一定要出现在Groupby子句中

IN子句中的Spark sql限制

oracle中group by用法

LINQ to SQL语句之Select/Distinct和Count/Sum/Min/Max/Avg (转)

Oracle 11g 中的限制子句

Laravel 5.8,在 where 子句中带有 Count(*) 的棘手子查询