SQL条件/案例联接/多态关联?

Dan*_*Dan 4 sql polymorphic-associations

我正在尝试实现类似于Ruby on Rails的多态关系的功能。我有以下三个表:

活动用户组织

事件可以是用户或组织的所有者,因此我的“事件”表包括以下列:owner_type和owner_id。

我可以通过内部连接和where子句轻松列出所有属于用户或组织的事件,但是,有一种方法可以根据owner_type列的值使连接表成为条件,允许将所有事件一起列出,不管owner_type?

我希望这是有道理的。

任何建议表示赞赏。

谢谢。

a'r*_*a'r 5

您不能将连接表设置为条件表,因此在这种情况下,您将必须将事件连接到用户和组织,并使用合并将公共字段(例如名称)合并在一起。

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'
Run Code Online (Sandbox Code Playgroud)

但是,您可以考虑创建一个所有者表,该表包含用户和组织,其结构类似于(id,type,org_id,name等)。这仅需要单个连接,但是可能会使架构的其他区域复杂化,例如。组织的用户成员资格。

另一种方法是将用户和组织表联合在一起,然后从事件中联接一次。