(SQL と SQLAlchemy の両方でこれを行う方法を説明できる人のためのボーナス インターネット。)
次のように3つのテーブルを設定しています。
**Bottom:**
id
name
middle_id
**Middle:**
id
name
top_id
**Top:**
id
name
各下部には中間があり、各中央には上部があります。ユーザーがクエリを入力すると、Bottom、Middle、および Top が検索されるように、データベースで検索を実行したいと考えています。誰かがたまたま Top にある項目を検索すると、Middle を経由して Top に関連するすべての Bottom.* が返されます。
2 つのレベルで機能するクエリを次に示します。
SELECT *
FROM Bottom
WHERE name LIKE '%query%'
UNION
SELECT Bottom.*
FROM Middle JOIN Bottom ON Bottom.middle_id = Middle.id
WHERE Middle.name LIKE '%query%'
Top WHERE Top.name LIKE '%query%' でも検索できるようにこれを拡張するにはどうすればよいですか? ただし、Middle.* を返す代わりに Bottom.* を返します。これはうまくいかないSQLですが、私が達成しようとしていることを説明していると思います:
SELECT *
FROM Bottom
WHERE name LIKE '%query%'
UNION
SELECT Bottom.*
FROM Middle JOIN Bottom ON Bottom.middle_id = Middle.id
WHERE Middle.name LIKE '%query%'
UNION
SELECT Bottom.*
FROM Top JOIN Middle ON Middle.top_id = Top.id
WHERE Top.name LIKE '%query%'
つまり、Middle のエントリに関連する Bottom のエントリがあり、Middle のエントリが Top のエントリに関連している場合、Top で適切な名前を検索すると、Middle のエントリではなく、そのエントリが返されます。は関連していますが、関連する Middle エントリに関連する Bottom エントリです。
次に例を示します。
データ:
**Bottom**
id 1
name Gus Fring
middle_id 1
**Middle**
id 1
name Jesse Pinkman
top_id 1
**Top**
id 1
name Walter White
「Walter White」を検索すると、Middle リレーション (Jesse Pinkman) ではなく、Bottom リレーションから Middle リレーションの結果 (Gus Fring) が返されます。
この問題はしばらくの間私を悩ませてきました。助けていただければ幸いです。前もって感謝します!:)