SQL多对多查询查找所有多个匹配重复问题

时间:2012-10-10 01:06:27

标签: mysql sql jpql

我一直在使用这样的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

1 个答案:

答案 0 :(得分:1)

更改HAVING子句以计算不同的字词,使用其他COUNT(DISTINCT sw.w_id) = 2COUNT(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 ;