鉴于你的答案,我的意见,这里是你将如何做到这一点的例子:
首先表:
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