sql select语句中的模糊计数

时间:2012-05-03 15:21:55

标签: sql oracle

我想之前在网站上已经提到过这个问题,但我找不到它。

我在一些网站上看到对搜索结果的模糊计数。例如,在stackoverflow中,当你搜索一个问题时,它表示+5000结果(有时候),在gmail中,当你按关键字搜索时,它表示“数百”,而在google中它表示aprox X结果。这只是向用户展示一个易于理解的巨大数字吗?或者这实际上是一种快速计算可以在数据库中使用的结果的方法[我现在正在学习Oracle 10g版本]?比如“嘿,如果你获得超过1k的结果,就停下来告诉我有超过1k的结果”。

由于

PS。我是数据库的新手。

6 个答案:

答案 0 :(得分:3)

通常这只是一种显示数字的好方法。

我不相信有一种方法可以在SQL中执行您所要求的操作 - 计数没有可用于计算直到某个数字的选项。

我也不会认为这是来自gmail或stackoverflow中的SQL。 大多数搜索引擎会向搜索返回总匹配数,然后让您翻阅结果。

至于使一个确切的数字更具人性可读性,这里是Rails的一个例子:

http://api.rubyonrails.org/classes/ActionView/Helpers/NumberHelper.html#method-i-number_to_human

答案 1 :(得分:2)

使用Oracle,您始终可以使用分析函数来计算要返回的精确行数。这是这种查询的一个例子:

SELECT inner.*, MAX(ROWNUM) OVER(PARTITION BY 1) as TOTAL_ROWS
FROM (
  [... your own, sorted search query ...]
) inner

这将为您提供特定子查询的总行数。当你想要应用分页时,你可以进一步包装这些SQL部分:

SELECT outer.* FROM (
  SELECT * FROM (
    SELECT inner.*,ROWNUM as RNUM, MAX(ROWNUM) OVER(PARTITION BY 1) as TOTAL_ROWS
    FROM (
      [... your own, sorted search query ...]
    ) inner
  ) 
  WHERE ROWNUM < :max_row
) outer
WHERE outer.RNUM > :min_row

min_rowmax_row替换为有意义的值。但请注意,如果不使用UNIQUE SCAN或对索引进行相对较窄的RANGE SCAN操作进行过滤,则计算精确行数可能会很昂贵。在此处详细了解:Speed of paged queries in Oracle

正如其他人所说的那样,您可以始终使用5000过滤器对您的查询设置绝对上限,例如ROWNUM <= 5000,然后只需指出结果超过5000+ 。请注意,在应用ROWNUM过滤时,Oracle可以非常擅长优化查询。在这里找到关于该主题的一些信息:

http://www.dba-oracle.com/t_sql_tuning_rownum_equals_one.htm

答案 2 :(得分:1)

我不知道这会有多快,但你可以试试:

SELECT NULL FROM your_tables WHERE your_condition AND ROWNUM <= 1001

如果结果中的行数等于1001,那么记录的总数将> 1000。

答案 3 :(得分:1)

模糊计数是一个将立即显示的缓冲区。如果用户想要查看更多结果,那么他可以请求更多。

这是一个表演设施,在显示结果后,谷歌等网站不断搜索更多结果。

答案 4 :(得分:1)

this question提供了一些非常好的信息

答案 5 :(得分:0)

执行SQL查询时,可以设置

 LIMIT 0, 100
例如

,你只能获得前100个答案。这样您就可以向观众打印出他们的请求有100多个答案。

对谷歌来说,我不能说他们是否真的知道有超过27'000'000'000的答案,但我相信他们确实知道。有一些标准请求存储了结果,并且更新是在后台完成的。