2011-05-29 71 views
1

是否可以合併這些查詢以便僅執行一次搜索條件?同時對多個字段進行分組和計數

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)而不是關係數據庫。新的想法是受歡迎的。

回答

2

Eduardo, 您允許使用存儲過程嗎?如果是這樣,您可以先執行通用部分。

SELECT ... 
FROM ads WHERE [search criteria] 

然後,你可以在較小的表上做多個查詢。您還可以存儲結果,並有三列返回了整個事情的一個表:

  1. 類型(類別,州,價格範圍等)
  2. 名(實際類別/狀態/等價值)
  3. count
+0

嗨,珍妮。如果我這樣做,我將在存儲過程中多次執行搜索條件。 – Eduardo 2011-05-29 19:12:01

+0

如果您只調用一次存儲過程,則不適用。存儲過程執行一次搜索條件並將結果存儲在「臨時表」(更像是一個臨時變量)中。其他查詢是針對臨時數據集運行的,而不是通過重複執行where子句。 – 2011-05-29 19:24:57

+0

請注意,如果您能夠使用分析功能,那就更好了。我不想推定你的數據庫。 – 2011-05-29 19:25:35

3

什麼是數據庫管理系統?在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 
+0

非常好的功能。不幸的是它是MySQL。 – Eduardo 2011-05-29 19:24:59

+0

你可能不得不使用臨時表比。 – Magnus 2011-05-29 19:26:43

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 
1

如果您的使用案例包括除了查詢全文搜索你列出的,Solr可能值得一看。在結合對結構化和文本數據的分面搜索,並且可以合理高效地完成各種計數。但是這部分取決於你有多少數據,以及你的用例是什麼。

+0

+1我一直在搜索Solr基於的Lucene,但沒有找到如何做這些計數沒有迭代結果。我一直在尋找其他的非SQL解決方案。 – Eduardo 2011-05-31 22:22:11

+0

Solr會爲你做點數;只需指定哪些類別應包含在結果中。您在使用Solr時不直接訪問Lucene,因爲Solr會爲您封裝它。也許我錯誤理解你的要求:你能說更多嗎? – 2011-06-01 01:06:54

相關問題