2009-10-23 101 views
1

有沒有人有任何想法如何創建一個產品過濾查詢(或查詢),將模擬結果在此頁上?棘手的查詢解決方案

http://www.emag.ro/notebook_laptop

說明

如果按HP作爲一個品牌,頁面會顯示所有的惠普產品,並可用過濾器的其餘部分是從該查詢結果雲集。到現在爲止,我沒有遇到任何問題。

按4GB拉姆,當然你會看到所有具有此屬性/功能的惠普產品。再次美好而華麗,直到這裏都沒有問題。

但是如果仔細觀察,您會發現品牌功能現在也可以顯示,比如說宏碁,擁有一些具有4GB功能的產品,或許還有更多宏碁之後,並且複選框尚未按下。

想到的唯一想法就是對數據庫進行更多的查詢以獲得這些其他可能性結果。

當你開始檢查第三個可能的選項(比如說顯示大小)後,事情開始變得更加複雜。

我想我的問題是: 有沒有人有任何想法如何使這不w/o徵稅大量的查詢服務器?

非常感謝您閱讀這篇文章,希望我在這個小故事中清楚地表達出自己的想法。

回答

0

這不是真正的「噸」查詢,它是每個屬性類型(品牌,內存,硬盤)的一個查詢。假設您選擇了HP,4GB RAM和250GB磁盤。現在針對每個屬性類型,根據過濾器選擇產品,但當前類型爲,並按當前類型按結果分組。在一個簡單的模型,查詢看起來是這樣的:

SELECT brand, count(*) FROM products WHERE ram='4BG' AND disk='250GB' GROUP BY brand 
SELECT ram, count(*) FROM products WHERE brand='HP' AND disk='250GB' GROUP BY ram 
SELECT disk, count(*) FROM products WHERE brand='HP' AND ram='4BG' GROUP BY disk 
SELECT cpu, count(*) FROM products WHERE brand='HP' AND ram='4BG' AND disk='250BG' GROUP BY cpu 
... 

您應該對列的索引,每個查詢不會做在桌子上順序掃描。當然,還有一些「流行」組合,當用戶排序/瀏覽列表時,您可能必須在多個頁面上顯示相同的數字,因此您可能需要緩存數字並在更新/插入/刪除時使緩存失效。

+0

我認爲這可能工作...我會嘗試和回來的結果:) 非常感謝的人! – 2009-10-23 10:57:55

+0

使用COUNT(1)而不是COUNT(*)。速度更快,因爲它不必遍歷所有列,看看它們是否爲NULL。 – Felix 2009-10-23 21:21:11

+0

@Felix:這不正確,'count(*)'和count(1)完全一樣 - 它對行進行計數。只有當你使用count(column)時,它纔會檢查它們是否爲NULL。 – 2009-10-24 06:46:33

1

看看SQL

UNION 

語法。

UNION用於將多個SELECT語句的結果合併爲一個結果集。」

+0

感謝您的想法:)從未使用UNION,但它看起來可能有助於在某些情況下! – 2009-10-23 10:58:28

0

這可能是有一些複雜的手段來確定您的標準結果的一些計算距離,但也許它就像在查詢中使用OR而不是AND一樣簡單。

+0

對不起,忘了提及我在同一組中的過濾器和組之間使用了OR。 – 2009-10-23 10:33:10