3

我一直在使用这样的 JPQL 查询:

SELECT s 
FROM Sentence s
INNER JOIN s.words sw
WHERE s.date = :date
AND sw IN (:words)
GROUP BY s
HAVING count(sw) = :numberOfWords

在 SQL 中,s.words 将是多对多中的链接表:word 是我们要匹配的单词的集合:numberOfWords 是集合中的单词数

对于那些不熟悉 JPQL 的人,可以在这里找到类似的 SQL: SQL query to find matches for multiple criteria

我遇到了一个问题,我不知道是设计问题还是查询问题。

所以我有句子 (s) 和单词 (w),而 sentence_word (sw) 表将两者连接起来。例如句子“Thelead dog of the group is blue”和[ the , cat ]的词集合,这个查询将选择这个句子作为匹配。这是一个误报,因为它包含两次“the”并且不包含“cat”。

在 SQL 中,我认为它是:

SELECT s.id
FROM sentence s
JOIN sentence_word sw ON ( sw.s_id = s.id )
JOIN word w ON ( w.id = sw.w_id )
WHERE w.word IN ( 'the', 'cat' )
GROUP BY s.id
HAVING COUNT(1) = 2

我能想到的最简单的解决方案是在链接表中禁止重复,所以这个句子中没有两个链接,只有一个(因此链接表存储该句子包含单词 the,而不是多少次)。但是,我认为有时我会想要多次搜索包含“the”的句子,所以我不想使用这个选项。

请帮忙!

资源

可以在此处找到类似搜索和性能的一些很好的示例(感谢链接的回答者):How to filter SQL results in a has-many-through relationship

4

1 回答 1

1

更改HAVING子句以计算不同的单词,使用 要么COUNT(DISTINCT sw.w_id) = 2要么COUNT(DISTINCT w.word) = 2

SELECT s.id
FROM sentence s
JOIN sentence_word sw ON ( sw.s_id = s.id )
JOIN word w ON ( w.id = sw.w_id )
WHERE w.word IN ( 'the', 'cat' )
GROUP BY s.id
HAVING COUNT(DISTINCT sw.w_id) = 2 ;
于 2012-10-10T07:27:00.813 回答