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 クエリ

問題が発生していますが、それがデザインの問題なのかクエリの問題なのかわかりません。

したがって、文 (s) と単語 (w) があり、sentence_word (sw) テーブルが 2 つを結合します。たとえば、「群れの番犬は青い」という文と、[ the , cat ] の単語集合の場合、このクエリはこの文を一致として選択します。「the」が 2 回含まれ、「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

私が考えることができる最も簡単な解決策は、リンクテーブルで重複を許可しないことです。そのため、この文の の 2 つのリンクではなく、1 つだけです (したがって、リンクテーブルには、文に単語が含まれていることが格納されます。 )。ただし、「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 に答える