在mysql db中获取集合的交集

时间:2013-10-31 19:15:01

标签: mysql sql intersection

我有下一个示例表:

+===========================+
| 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 1'的三个交叉点     for person_id 2:(1)     for person_id 4:(1,3)     for 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) 谢谢你的关注。

1 个答案:

答案 0 :(得分: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