gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 08:51:49 25 4
gpt4 key购买 nike

我一直在使用这样的 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) 表连接了两者。例如句子“The lead 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,而不是多少次)。但是,我认为有时我会多次搜索包含“the”的句子,因此我不希望使用此选项。

请帮忙!

资源

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

最佳答案

更改 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 ;

关于mysql - SQL多对多查询查找所有多个匹配重复问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12810564/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com