SQL 条件/案例连接/多态关联?
-
22-09-2019 - |
题
我正在尝试实现类似于 Ruby on Rails 的多态关系的东西。我有以下三个表:
活动用户组织
事件可以由用户或组织拥有,因此我的事件表包含以下列:所有者类型和所有者 ID。
我可以通过内部联接和 where 子句轻松列出属于用户或组织的所有事件,但是,有没有一种方法可以根据owner_type 列的值使联接表有条件,从而允许将所有事件一起列出,无论所有者类型如何?
我希望这是有道理的。
任何建议表示赞赏。
谢谢。
解决方案
您不能使连接表的条件,所以在这种情况下,你将不得不参加活动,用户和组织和使用聚结以共同的领域(如名称)合并到一起。
select e.id, coalesce(u.name, o.name) owner_name
from events e
left join users u on e.owner_id = u.id and e.owner_type = 'user'
left join organisations o on e.owner_id = o.id and e.owner_type = 'org'
但是,你可以考虑创建一个业主表,其中包含用户和组织,与像(ID,类型,org_id,姓名,...)的结构。这将只需要一个单一的加入,但可能会复杂化的模式,如其他领域。一个组织的用户的成员资格。
的另一种方法将是联合的用户和组织表在一起,然后从事件加入一次。
不隶属于 StackOverflow