0

(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) が返されます。

この問題はしばらくの間私を悩ませてきました。助けていただければ幸いです。前もって感謝します!:)

4

2 に答える 2

3

LEFT JOINS を使用する必要があると思います。すべてのテーブルを結合し、値を検索します。

いくつかのコードを提供しましょう:

SELECT
 bottom.name,
 middle.name,
 top.name
FROM
 bottom
 LEFT JOIN middle ON top.id = middle.id
 LEFT JOIN top ON middle.id = top.id
WHERE
 middle.name LIKE '%name%'
 OR top.name LIKE '%name%'
 OR bottom.name LIKE '%name%'
于 2012-07-02T05:17:50.150 に答える
2

これを試して

select
  b.id,
  b.name,
  b.middle_id,
  m.top_id,
  m.name,
  t.name
from bottom as b
  left join (select  id,`name`, top_id  from Middle) as m  on m.id = b.middle_id
  left join (select  id,`name`from Top) as t   on t.id = m.top_id
于 2012-07-02T05:12:36.607 に答える