私はデータベースを持っています
books (primary key: bookID)
characterNames (foreign key: books.bookID)
locations (foreign key: books.bookID)
文字名と場所のテキスト内位置は、対応するテーブルに保存されます。
私は psycopg2 を使用して Pythonscript を作成しており、本の中で特定のキャラクター名と場所のすべての出現を見つけています。キャラクター名と場所の両方が見つかった本での出現のみが必要です。
ここでは、1 つの場所と 1 つの文字を検索するためのソリューションを既に取得しています。
WITH b AS (
SELECT bookid
FROM characternames
WHERE name = 'XXX'
GROUP BY 1
INTERSECT
SELECT bookid
FROM locations
WHERE l.locname = 'YYY'
GROUP BY 1
)
SELECT bookid, position, 'char' AS what
FROM b
JOIN characternames USING (bookid)
WHERE name = 'XXX'
UNION ALL
SELECT bookid, position, 'loc' AS what
FROM b
JOIN locations USING (bookid)
WHERE locname = 'YYY'
ORDER BY bookid, position;
CTE 'b' にはすべての bookid が含まれており、文字名 'XXX' と場所 'YYY' が表示されます。
さらに、2 つの場所と名前 (またはそれぞれ 2 つの名前と場所) を検索することについても考えています。検索対象のすべてのエンティティが 1 つの本に含まれている必要がある場合は簡単ですが、次の場合は
どう
でしょ
う
か
。アル、ツールショップ)
この問題は、4、5、6... の条件で繰り返すことができます。
サブクエリをさらにINTERSECTすることを考えましたが、うまくいきません。
代わりに、見つかった bookID を UNION し、グループ化して、複数回出現する bookid を選択します。
WITH b AS (
SELECT bookid, count(bookid) AS occurrences
FROM
(SELECT DISTINCT bookid
FROM characterNames
WHERE name='XXX'
UNION
SELECT DISTINCT bookid
FROM characterNames
WHERE name='YYY'
UNION
SELECT DISTINCT bookid
FROM locations
WHERE locname='ZZZ'
GROUP BY bookid)
WHERE occurrences>1)
これはうまくいくと思いますが、現時点ではテストできませんが、これが最善の方法ですか?