我真的不知道该给它起什么标题。
我有几个这样结构的表
一个“句子”表
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_id
至 r1.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/