使用字段数据的条件JOIN

时间:2016-03-24 13:13:44

标签: mysql join left-join

我有以下表格:

用于存储狗的

id, name, event_id

活动id, title, owner_id用于存储生日,疫苗等活动

所有者id, name,用于存储所有者。原始所有者是一个id为1

的狗窝

owner_event original_owner_event_id, other_owner_event_id用于将各种所有者事件相互等同,即原始所有者可能会认为“行走事件”等于其他所有者的“播放捕获”事件

加入一切:

加入活动,其中dog.event_id = event.id

所有者加入活动,其中event.owner_id = owner.id

这是棘手的部分

owner_id > 1然后事件加入 owner_event ,其中owner_event.other_owner_event_id = event.id

否则,事件加入 owner_event ,其中owner_event.original_owner_event_id = event.id

到目前为止,我有以下内容:

SELECT * FROM dog
LEFT JOIN event `event` ON `event`.id = dog.event_id
LEFT JOIN owner `owner` ON `owner`.id = `event`.owner_id
LEFT JOIN owner `owner_event_other` ON `owner_event_other`.other_owner_event_id = `event`.id AND `owner`.id > 1
LEFT JOIN owner `owner_event_original` ON `owner_event_original`.original_owner_event_id = `event`.id AND `owner`.id = 1
WHERE dog.id = 3

我只是不确定如何为狗event.title实际获得3(例如)。

请注意,根据event.id,它可能是owner_event.other_owner_event_id列或owner_event.original_owner_event_id列中的owner.id

1 个答案:

答案 0 :(得分:1)

由于给定的owner记录只能存在两种可能性中的一种,我建议只加入owner_event一次,但第二次连接event以便通过原始所有者的事件检索标题(如果直接检索的event记录不代表该标题。使用COALESCE,您可以选择正确的标题。

SELECT    dog.*,
          COALESCE(original_event.title, event.title) AS original_event_title 
FROM      dog
LEFT JOIN event 
       ON event.id = dog.event_id
LEFT JOIN owner 
       ON owner.id = event.owner_id
LEFT JOIN owner_event
       ON owner_event.other_owner_event_id = event.id
LEFT JOIN event original_event
       ON original_event.id = owner_event.original_owner_event_id
WHERE     dog.id = 3