私のコメントに対するあなたの答えを考えると、これはあなたがそれを行う方法の例です:
最初にテーブル:
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
クエリを試して、必要なものかどうかを確認してください。
また、これは処理能力の点で最善の解決策ではないことにも注意してください。インデックスを追加し、オプション フィールドを整数にし、可能な限り結果をキャッシュすることをお勧めします。
質問や追加したいことがあればコメントを残してください。