我有以下数据库架构:
高分辨率图像在这里http://s18.postimage.org/mlyw5gea1/schema2.png
如你看到的 :
演讲者直接与会话相关联。
一个部分直接与一个会话相关联。
扬声器通过扬声器函数间接关联到一个部分,然后是 secion_speakerfunction-join-table 直到该部分。
如何让有间接会议的所有演讲者不是直接会议之一
欢迎任何帮助。
谢谢
我有以下数据库架构:
高分辨率图像在这里http://s18.postimage.org/mlyw5gea1/schema2.png
如你看到的 :
演讲者直接与会话相关联。
一个部分直接与一个会话相关联。
扬声器通过扬声器函数间接关联到一个部分,然后是 secion_speakerfunction-join-table 直到该部分。
如何让有间接会议的所有演讲者不是直接会议之一
欢迎任何帮助。
谢谢
不幸的是,我无法缩放您的图形,因此以下涉及一些猜测。
正如您已经说过的,有两种方法可以从任何给定的会话中获得相关的演讲者。首先,您可以获得与会话直接关联的发言人列表:
SELECT speaker.* FROM `session-speaker-join-table`
JOIN speaker
ON speaker.id=`session-speaker-join-table`.speaker_id
WHERE `session-speaker-join-table`.session_id=1234
以下是如何通过扬声器函数间接链接扬声器列表:
SELECT speaker.* FROM section
JOIN `section-speakerfunction-join-table`
ON `section-speakerfunction-join-table`.section_id=section.id
JOIN speakerfunction
ON speakerfunction.id=`section-speakerfunction-join-table`.speakerfunction_id
JOIN speaker
ON speaker.id=speakerfunction.speaker_id
WHERE section.session_id=1234
编辑:阅读您的评论后,我了解您想要查询 2 的结果减去查询 1 的结果。这可以通过将 a 添加LEFT JOIN
到第二个查询然后检查是否不匹配来完成,如下所示:
SELECT speaker.* FROM section
JOIN `section-speakerfunction-join-table`
ON `section-speakerfunction-join-table`.section_id=section.id
JOIN speakerfunction
ON speakerfunction.id=`section-speakerfunction-join-table`.speakerfunction_id
JOIN speaker
ON speakerfunction.speaker_id = speaker.id
LEFT JOIN `session-speaker-join-table`
ON `session-speaker-join-table`.session_id=section.session_id
AND `session-speaker-join-table`.speaker_id=speaker.speaker_id
WHERE section.session_id=1234 AND `session-speaker-join-table`.speaker_id IS NULL
(我还更改了表名并包含了反引号,我希望我能全部抓住它们。还重新格式化了查询以提高可读性。)
通过阅读A Visual Explanation of SQL Joins和这篇关于net.tutsplus的清晰文章和一些头发拉扯来刷新我的记忆后,我能够提出一个有效的查询。
从扬声器中选择 * 作为 spk 内连接 SpeakerFunction 作为 spkfun 开启(spkfun.speaker_id = spk.id) 内连接 section_speakerfunction-join-table as s_spkfun 上(s_spkfun.speakerFunction_id = spkfun.id) 内连接部分为 s 上(s.id = s_spkfun.section_id) 内部加入会话为 sess1 上(sess1.id = s.session_id) left join session-speaker-join-table as sess-spk 开启(sess-spk.speaker_id = spk.id) 离开加入会话为 sess2 上(sess2.id = sess-spk.session_id) 其中 sess-spk.session_id 为空
如您所见,有很多内连接,然后是左外连接,以便能够在空 session_id 上过滤(where 子句)。
谢谢大家!