我有下一个示例表:
+===========================+
| 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) 谢谢你的关注。
答案 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