MySQL 根据第二个表中的条目对相似行进行分组

标签 mysql sql grouping

我真的不知道该给它起什么标题。

我有几个这样结构的表

一个“句子”表

id |    sentence       | ...
----------------------------
1  | See Spot run      | ...
2  | See Jane run      | ...
3  | Jane likes cheese | ...

“单词”表

id | word (unique)
----------
1  | See
2  | Spot
3  | run
4  | Jane
5  | likes
6  | cheese

还有一个“word_references”表

sentence_id | word_id
---------------------
          1 | 1 
          1 | 2
          1 | 3
          2 | 1
          2 | 3
          2 | 4
          3 | 4
          3 | 5
          3 | 6

我想根据按相似度排序的共享词返回彼此相似的句子对列表。所以它应该返回:

one | two | similarity
----------------------
 1  |  2  |  2
 2  |  3  |  1

因为句子 1 和句子 2 共用两个词:“See”和“run”,而句子 2 和 3 共用一个词:“Jane”。

最佳答案

这个查询应该可以解决您的问题:

SELECT r1.sentence_id AS one, 
       r2.sentence_id AS two, 
       Count(*)       AS similarity 
FROM   word_references r1 
       INNER JOIN word_references r2 
               ON r1.sentence_id < r2.sentence_id 
                  AND r1.word_id = r2.word_id 
GROUP  BY r1.sentence_id, 
          r2.sentence_id 

这给出:

one | two | similarity
----------------------
 1  |  2  |  2
 2  |  3  |  1

sqlfiddle here

如果您更改表达式 r1.sentence_id < r2.sentence_idr1.sentence_id <> r2.sentence_id ,你会得到关系的两边:

one | two | similarity
----------------------
 1  |  2  |  2
 2  |  3  |  1
 2  |  1  |  2
 3  |  2  |  1

关于MySQL 根据第二个表中的条目对相似行进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28573693/

相关文章:

php - 如果数组键值为空,如何自动生成数组键值(来自查询)

sql - 为具有复杂关系的 3 个表创建 View

machine-learning - 对自由格式文本条目进行分类或聚类的好方法是什么?

mysql - 使用 UNION ALL 选择以将表名显示为附加列

java - 新的 EntityManager 有时会从 MySQL 获取陈旧数据

mysql - 从 mysql Workbench 中的脚本创建数据库

sql - 如何根据 bool 值更改表格?

SQL Server 按组累计总和

algorithm - 最有效的选择周围点最多的点的方法

asp.net - 使用 Nhibernate 在子查询中仅选择不带 group by 属性的 max 子句