(任何能够解释我如何在 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)。
这个问题已经困扰了我一段时间,我非常感谢任何帮助。提前致谢!:)