、私はこのようなご質問で説明したものと同様の簡単なテーブルを、定義している:
また
CREATE TABLE pref (
user integer not null,
pref integer not null,
value bool default false,
primary key (user, pref)
);
、私は、次のサンプルデータを追加しました:
INSERT INTO pref VALUES
(2, 1, true), (3, 3, false), (2, 3, false),
(6, 2, true), (3, 1, false);
「類似の設定」の原則的な考え方は、self-joinの概念に基づいています。すなわち、それ自体で環境設定DBテーブルに参加します。それで遊んでた後、私はすぐに次SELECT
ステートメントに来た:
leftuser rightuser score
2 3 1
3 2 1
期待されているまさにです:
- ユーザー
SELECT leftpref.user as leftuser, rightpref.user as rightuser, count(*) as score from pref leftpref
INNER JOIN pref rightpref on leftpref.pref = rightpref.pref and leftpref.value = rightpref.value
WHERE leftpref.user <> rightpref.user
GROUP BY leftpref.user, rightpref.user
;
これは、次のような結果が得られます2はユーザー3と1つの優先度を共有します
- 2行目は、ユーザー3が私たちと優先度を共有する対称的なステートメントです2人のユーザーが共有しているER 2.
- より多くの好みは、より高いスコアが
「ユーザーにプラグ」されると、そのクエリに別のAND leftuser = <userid>
を追加することです。
ここには3つのテーブルがあります。あなたの現在のスキーマは何ですか? – tadman
@tadman。 3つのテーブルが必要ですが、これは厳密に3つのカラムを持つ単一のテーブルです。そのうち2つは外部キーです。 –