2012-07-02 58 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