鑑於你的答案,我的意見,這裏是你將如何做到這一點的例子:
首先表:
CREATE TABLE `items` (
`id` int(11) NOT NULL,
`name` varchar(80) NOT NULL
);
CREATE TABLE `criteria` (
`cid` int(11) NOT NULL,
`option` varchar(80) NOT NULL,
`value` int(1) NOT NULL
);
隨後的一些項目和標準的例子:
INSERT INTO items (id, name) VALUES
(1,'Name1'),
(2,'Name2'),
(3,'Name3');
INSERT INTO criteria VALUES
(1,'option1',1) ,(1,'option2',1) ,(1,'option3',0),
(2,'option1',0) ,(2,'option2',1) ,(2,'option3',1),
(3,'option1',1) ,(3,'option2',0) ,(3,'option3',1);
這將創建3個項目和3個選項併爲其分配選項。
現在有多種方式可以通過某種「強度」來訂購。其中最簡單的是:
SELECT i . * , c1.value + c3.value AS strength
FROM items i
JOIN criteria c1 ON c1.cid = i.id AND c1.option = 'option1'
JOIN criteria c3 ON c3.cid = i.id AND c3.option = 'option3'
ORDER BY strength DESC
這會告訴你所有具有選項1或選項3,但那些用這兩個選項會出現排「的項目更高
這種運作良好,如果你。我們假設你對所有3個選項進行搜索,現在所有的項目都具有相同的強度,這就是爲什麼爲選項分配「權重」很重要的原因。你的優勢的價值,但是如果你的查詢不總是把相同的權重分配給任何地方的相同選項,那可能無法幫到你。 y通過以下查詢在每個查詢的基礎上實現:
SELECT i.* , IF(c1.value, 2, 0) + IF(c3.value, 1, 0) AS strength
FROM items i
JOIN criteria c1 ON c1.cid = i.id AND c1.option = 'option1'
JOIN criteria c3 ON c3.cid = i.id AND c3.option = 'option3'
ORDER BY strength DESC
嘗試查詢,看看它是否是你需要的。
我還想指出,這不是處理能力方面的最佳解決方案。我建議你添加索引,使選項字段爲整數,儘可能緩存結果。
如果您有任何問題或需要添加任何內容,請發表評論。
選項A和B如何存儲在表中? – Khez 2011-05-04 02:52:21
在基於選項的1或0表中。但這最終會混合到其他搜索條件中...... – 2011-05-04 03:01:16
已添加答案,請務必查看並回答問題。 – Khez 2011-05-04 04:12:19