2014-11-14 77 views
0

我必須維護一個數據庫,其用戶有3個不同的表(針對不同的角色)。不幸的是,合併它們是不允許的。如何加入條件表

還有另一張表記錄他們的活動,這張表有兩列用於標識特定用戶,一個是userId,另一個是roleId。現在,當我想列出所有用戶的用戶活動時,根據roleId中的值,我將不得不使用不同的表來連接每一行。

如果只有一個表的用戶,查詢將是這樣的:

SELECT * FROM activity JOIN buyers ON activity.userId = buyers.id 

所以,我怎麼會在這個查詢擴展,現在,如果我有3代表與用戶:buyerssellersadministrators;知道activity表中的roleId列標識買方,賣方或管理員?

+0

3個單獨的查詢和兩個union語句? – xQbert 2014-11-14 16:42:57

+1

我會質疑「合併它們不被允許」的概念。一個糟糕的設計不應該被允許只是因爲「不允許」改變它而被傳播。如果你需要頻繁地進行這種查詢,那麼你的設計就不好,你應該解決它。 – 2014-11-14 16:44:52

+0

我個人不允許進行更改,無論性能或其他方面有多糟糕。這是怎麼回事:( – 2014-11-14 16:54:11

回答

0
SELECT *, 'Buyer' as accountType FROM activity JOIN buyers b ON activity.userId = b.id 
UNION 
SELECT *, 'Seller' FROM activity JOIN sellers s ON activity.userId = s.id 
UNION 
SELECT *, 'Admin' FROM activity JOIN administrators a ON activity.userId = a.id 

可以給我不能改變任何現有的表的設計考慮寫上面的觀點,這樣在需要我能建造它。

如果買方,賣方和管理員有不同的列,則可能必須拼出特定的表格列。鑑於你沒有提供表結構,我假設它們對於這個示例目的是相同的。

0

只是在這裏猜測roleId如何與其他表相關。

SELECT * FROM activity JOIN buyers ON activity.userId = buyers.id 
WHERE activity.roleId = 1 
UNION SELECT * FROM activity JOIN sellers ON activity.userId = sellers.id 
WHERE activity.roleId = 2 
UNION SELECT * FROM activity JOIN administrators ON activity.userId = administrators.id 
WHERE activity.roleId = 3