鉴于您对我的评论的回答,这里有一个关于如何做到这一点的示例:
首先是表:
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 的项目,但同时具有这两个选项的项目似乎排名“更高。
如果您正在搜索 2 个选项,这很有效。但是让我们假设您搜索所有 3 个选项。现在所有项目都具有相同的强度,这就是为什么为选项分配“权重”很重要。
您可以将值作为您的优势,但如果您的查询并不总是将相同的权重分配给所有地方的相同选项,那么这可能对您没有帮助。这可以通过以下查询在每个查询的基础上轻松实现:
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
尝试查询,看看它是否是您需要的。
我还想指出,就处理能力而言,这不是最佳解决方案。我建议您添加索引,使选项字段为整数,尽可能缓存结果。
如果您有任何问题或要添加的内容,请发表评论。