一次对多个字段进行分组和计数

时间:2011-05-29 19:01:34

标签: sql filter lucene search-engine data-warehouse

是否可以合并这些查询,以便搜索条件只执行一次?

SELECT category, count(*)
FROM   ads
WHERE  [search criteria]
GROUP BY category

SELECT state, count(*)
FROM   ads
WHERE  [search criteria]
GROUP BY state

SELECT price_range, count(*)
FROM   ads
WHERE  [search criteria]
GROUP BY price_range

...

Plus about 10 more COUNTS

我的目标是创建一个类似于this website中使用的过滤器。

我正在考虑使用某种搜索引擎(例如Lucene)而不是关系数据库。欢迎新的想法。

4 个答案:

答案 0 :(得分:3)

什么是DBMS?在Oracle中,您可以使用分析函数执行此操作:

SELECT category, state, price_range,
       COUNT( 1 ) OVER ( PARTITION BY category ) AS category_count,
       COUNT( 1 ) OVER ( PARTITION BY state) AS state_count,
       COUNT( 1 ) OVER ( PARTITION BY price_range ) AS price_count
  FROM ads

答案 1 :(得分:2)

爱德华, 你被允许使用存储过程吗?如果是这样,您可以先执行公共部分。

SELECT ... 
FROM   ads WHERE  [search criteria]

然后,您可以在较小的表上进行多个查询。您还可以存储结果并将整个事物作为一个表返回三列:

  1. 类型(类别,州,价格范围等)
  2. 名称(实际上是类别/州/等值)
  3. 计数

答案 2 :(得分:1)

如果您的用例除了列出的查询外还包含全文搜索,那么Solr可能值得一看。通过对结构化和文本数据进行分面搜索,可以合理有效地完成您想要的各种计数。但这部分取决于你拥有多少数据,以及你的用例是什么。

答案 3 :(得分:0)

你可以使用嵌套查询和一些技巧;)

  select category,countCategory,state,countState,price_range,countPrice_range from 
    (SELECT 1 pcol,category, count(*) countCategory
    FROM   ads
    WHERE  [search criteria]
    GROUP BY category) 
    a
    inner  join
    (
    SELECT 1 pcol,state, count(*) countState
    FROM   ads
    WHERE  [search criteria]
    GuROUP BY state
    ) b
    on a.pcol=b.pcol
    inner join
    (SELECT 1 pcol,price_range, count(*) countPrice_range
    FROM   ads
    WHERE  [search criteria]
    GROUP BY price_range)
    )
    on a.pcol=b.pcol