2012-07-02 56 views
0

(奖金互联网络的人谁可以解释我如何在SQL和SQLAlchemy的做到这一点。)MySQL的 - 多个联盟

我有三个表设置像这样:

**Bottom:** 
id 
name 
middle_id 

**Middle:** 
id 
name 
top_id 

**Top:** 
id 
name 

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

这里有两个层面的工作查询:

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

如何扩展这使得它也可以搜索热门WHERE Top.name LIKE“%查询%”,但而不是返回中东* ,它返回底部。*?下面是一些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中的条目与Top中的条目相关,如果我搜索Top作为合适的名称,它将不返回与其相关的中间条目,而是返回与相关中间条目相关的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 

如果我搜索“沃尔特·白”将返回不中东关系(杰西Pinkman),而是底部关系对中东关系的结果(Gus Fring)。

这个问题一直困扰我一会儿,我非常感谢任何帮助。提前致谢! :)

回答

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 
+0

谢谢!这工作完美:)。现在我需要弄清楚如何将这个转换为SQLAlchemy。 – user1492385

3

我认为你应该使用LEFT连接。 你所做的是加入所有的表格,然后搜索值。

让我为你提供一些代码:

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

谢谢!我认为Raheel_just_击败了你,但是这也有效。我希望我可以选择两个正确的答案。 – user1492385