2014-11-14 57 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