1

次の例のテーブルがあります。

+===========================+
| person_id | preference_id |
+===========+===============+
|     1     |       1       |
|     1     |       2       |
|     1     |       3       |
|     2     |       1       |
|     3     |       4       |
|     4     |       1       |
|     4     |       3       |
|     5     |       2       |
|     5     |       8       |
+___________+_______________+

そして、person_id 1 のセットの最初の 10 個の交差を取得したい (はい、例には 5 人のみが含まれます)。つまり: (1,2,3) ∩ (1) ∩ (4) ∩ (1,3) ∩ (2,8)

person_id 2 の 4 つのセットの 'person_id 1' の 3 つの交差があります: (1) person_id 4 の場合: (1,3) person_id 5 の場合: (2)

//person_id 3: no set that contains in person_id 1

そして… person_id 2、3、4、5 などについてはわかりません。person_id と preference_id には 10000 行以上が含まれます。あなたが見たように、私が望んでいること: - mysql で交差を検索するための高速でクリーンな方法 - 上位 10 の交差を取得します (位置の数を想定すると、person_id 4 が最も関連性が高く、次に 2 と 5) ご注意いただきありがとうございます。

4

1 に答える 1

3
SELECT t2.person_id, COUNT(*) int_size, GROUP_CONCAT(t2.preference_id) shared_preferences
FROM table t1
JOIN table t2 ON t1.preference_id = t2.preference_id
WHERE t1.person_id = 1
AND t2.person_id != 1
GROUP BY t2.person_id
ORDER BY int_size DESC
LIMIT 10
于 2013-10-31T19:24:39.040 に答える