2012-07-16 116 views
3

我目前正在建立一個汽車經銷商的網站。我希望允許用戶細化類似於亞馬遜或eBay的搜索結果。通過點擊來縮小結果的能力會很好。問題是我這樣做的方式,現在有許多不同的查詢需要用COUNT總共完成。PHP MYSQL精簡搜索多個查詢

因此,要縮小的主要方式的結果是:

  • 車輛類型
  • 價格範圍
  • 全新/二手

目前我我每次加載這個頁面時都會做5個查詢來獲得結果的數量同時傳入設定值。

查詢1:

SELECT vehicle_type, COUNT(*) AS total FROM inventory 
[[ Already Selected Search Parameters]] 
GROUP BY vehicle_type 
ORDER BY vehicle_type ASC 

查詢2:

SELECT make, COUNT(*) AS total FROM inventory 
[[ Already Selected Search Parameters]] 
GROUP BY make 
ORDER BY make ASC 

查詢3,4,5 ......

有沒有辦法在一個查詢中這樣做嗎?速度更快嗎?

回答

2

您的詢問似乎很合理。

你可以做到這一點,使用UNION ALL一個查詢:

SELECT 'vehicle_type' AS query_type, vehicle_type, COUNT(*) AS total 
FROM inventory 
... 
GROUP BY vehicle_type 

UNION ALL 

SELECT 'make', make, COUNT(*) AS total FROM inventory ... GROUP BY make 

UNION ALL 

SELECT ... etc ... 

這樣做的性能優勢也不會很大。

如果您發現您正在解決這些查詢並且結果不會經常更改,那麼您可能需要考慮緩存結果。考慮使用類似memcache的東西。

+0

我打算看看memcache,我一直想看看它很長一段時間。經銷商做了一些大的促銷活動,並且一次有數百人成千上萬的人上網。只是想確保它最初是正確構建的 – hippobebo 2012-07-16 22:49:43

1

有幾種方法可以根據數據倉庫對數據進行排名,但您試圖在搜索詞中完成的任務稱爲方面。一個真正的搜索引擎(將與您提到的網站一起使用)執行此操作。

許多網站利用Lucene(基於Java的)與SOLR搜索引擎來完成你指的是什麼。有一個名爲ElasticSearch的新解決方案,它具有RESTful API並提供方面,但您需要安裝Java,ES,然後可以調用返回本機JSON的搜索引擎。

做這在MySQL不需要這麼多的加入可能需要額外的表,或許觸發並獲得複雜。如果汽車經銷商不期望Cars.com的流量(百萬/天),然後你可能會試圖在實際需要之前優化一些東西。您的遞歸查詢可能速度夠快,並且您沒有報告存在實際問題或瓶頸。