【问题标题】:Get intersection of sets in mysql db在mysql db中获取集合的交集
【发布时间】:2013-10-31 19:15:00
【问题描述】:

我有下一个示例表:

+===========================+
| 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”的三个交集 对于person_id 2:(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) 感谢您的关注。

【问题讨论】:

  • 。 .我,一方面,不知道你在问什么。深吸一口气,喝一口水。编辑问题,并假装您正在向孩子解释。我们没有您要解决的问题的上下文。列是什么意思?您提出请求的目的是什么?你期待的结果是什么?您是否意识到对于您的初始请求,答案是空集?
  • 我想我明白他想要什么:与 person_id 1 最相似的 person_id。
  • 实际上,他想要前 10 个 person_id,按照他们与 person_id 共有的preference_id 的数量排名。想想约会服务试图通过共同兴趣的数量来匹配人们。

标签: mysql sql intersection


【解决方案1】:
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

【讨论】:

  • 巴尔玛,谢谢你。你正确地理解了我(但它不是约会服务)。抱歉 - 我不能投票。
  • 我的意思是它就像约会服务中的算法。
  • 是的,这是我的错误(英语不是母语)。
猜你喜欢
  • 2010-12-16
  • 1970-01-01
  • 2013-07-03
  • 2021-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-06
相关资源
最近更新 更多