Учитывая ваш ответ на мой комментарий, вот пример того, как вы можете это сделать:
Первые столы:
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
Попробуйте выполнить запросы и посмотрите, нужно ли вам это.
Я также хотел бы отметить, что это не лучшее решение с точки зрения вычислительной мощности. Я бы порекомендовал вам добавить индексы, сделать поле опций целым числом, по возможности кэшировать результаты.
Оставьте комментарий, если у вас есть какие-либо вопросы или что-то добавить.