2016-05-30 11 views
1

私は、MySQLデータベースのユーザのための大きなプリファレンスリストを持っています。例えば、MySQLの環境設定ファインダ

User 2 - Preference 1 - yes 
User 3 - Preference 3 - no 
User 2 - Preference 3 - no 
User 6 - Preference 2 - yes 
User 3 - Preference 1 - no 

基本的に、私は、ユーザーにプラグインすることができますクエリをデザインしようとしていますし、それは似た嗜好を持つユーザーを検索します。たとえば、上記に「ユーザー2」を差し込むと、#3の嗜好を共有しているため「ユーザー3」が返されます。クエリは、複数の似たようなユーザーを見つけ、すべての設定で考慮する必要があります。

MySQLとPHP(必要な場合)を使って、どうすればいいですか?何か助けて!

ありがとうございます!簡単のため

+3

ここには3つのテーブルがあります。あなたの現在のスキーマは何ですか? – tadman

+0

@tadman。 3つのテーブルが必要ですが、これは厳密に3つのカラムを持つ単一のテーブルです。そのうち2つは外部キーです。 –

答えて

0

、私はこのようなご質問で説明したものと同様の簡単なテーブルを、定義している:

また
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>を追加することです。