使用字段数据的条件 JOIN
Conditional JOIN using field data
我有以下表格:
dog: id, name, event_id
用来存放狗
事件: id, title, owner_id
用于存储生日、疫苗等事件
owner: id, name
用来存放所有者。原主人是一个id为1
的犬舍
owner_event: original_owner_event_id, other_owner_event_id
用于将各种所有者事件相互等同,即原始所有者可能会考虑 "walk event"等于其他所有者的 "play catch" 事件。
加入一切:
dog 加入 event where dog.event_id = event.id
owner 加入 event where event.owner_id = owner.id
这是棘手的部分:
When owner_id > 1
then event join owner_event where 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
我只是不确定现在如何为狗 3
实际获取 event.title
(例如)。
请记住,它可能是 owner_event.other_owner_event_id
列中的 event.id
或 owner_event.original_owner_event_id
列,具体取决于 owner.id
。
由于给定 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
我有以下表格:
dog: id, name, event_id
用来存放狗
事件: id, title, owner_id
用于存储生日、疫苗等事件
owner: id, name
用来存放所有者。原主人是一个id为1
owner_event: original_owner_event_id, other_owner_event_id
用于将各种所有者事件相互等同,即原始所有者可能会考虑 "walk event"等于其他所有者的 "play catch" 事件。
加入一切:
dog 加入 event where dog.event_id = event.id
owner 加入 event where event.owner_id = owner.id
这是棘手的部分:
When owner_id > 1
then event join owner_event where 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
我只是不确定现在如何为狗 3
实际获取 event.title
(例如)。
请记住,它可能是 owner_event.other_owner_event_id
列中的 event.id
或 owner_event.original_owner_event_id
列,具体取决于 owner.id
。
由于给定 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