我一直在使用这样的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中,单词将是多对多的链接表 :word是我们想要匹配的单词集合 :numberOfWords是集合中的单词数
对于那些不熟悉JPQL的人,可以在这里找到类似的SQL: SQL query to find matches for multiple criteria
我遇到了问题,我不知道这是设计还是查询问题。
所以我有句子和单词(w),而sentence_word(sw)表加入了这两个。例如句子“该组的主角是蓝色”和[该,猫]的单词集合,此查询将选择该句子作为匹配。这是误报,因为它包含两次“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”的句子,所以我不想使用这个选项。
请帮忙!
资源
这里可以找到类似搜索和性能的一些很好的例子(感谢链接的回答者):How to filter SQL results in a has-many-through relation
答案 0 :(得分: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 ;