是否可以合并这些查询,以便搜索条件只执行一次?
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)而不是关系数据库。欢迎新的想法。
答案 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]
然后,您可以在较小的表上进行多个查询。您还可以存储结果并将整个事物作为一个表返回三列:
答案 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