0

(任何能够解释我如何在 SQL 和 SQLAlchemy 中做到这一点的人都可以获得互联网奖励。)

我设置了三个表,如下所示:

**Bottom:**
id
name
middle_id

**Middle:**
id
name
top_id

**Top:**
id
name

每个底部都有一个中间,每个中间都有一个顶部。我想在数据库上进行搜索,以便当用户输入查询时,它将搜索底部、中间和顶部。如果有人搜索一个恰好在 Top 的项目,它将通过 Middle 返回所有与 Top 相关的 Bottom.*。

这是一个适用于两个级别的查询:

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%'

换句话说,如果我在底部有一个与中间条目相关的条目,并且中间的条目与顶部的条目相关,如果我在顶部搜索适当的名称,它将不会返回中间条目与它相关,但与相关的中间条目相关的底部条目。

这是一个例子:

数据:

**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”,它不会返回中间关系(Jesse Pinkman),而是返回底部关系到中间关系的结果(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 回答