我有以下数据库架构:
高分辨率图片在这里http://s18.postimage.org/mlyw5gea1/schema2.png
如你所见:
发言人直接与会话相关联。
一个部分直接与会话相关联。
扬声器通过speakerFunction与一个部分间接关联,然后是secion_speakerfunction-join-table直到该部分。
如何让间接会话的所有发言人都不是直接会议之一
欢迎任何帮助。
由于
答案 0 :(得分:0)
不幸的是,我无法缩放您的图形,因此以下内容涉及一些猜测。
正如您已经说过的,有两种方法可以从任何给定的会话到相关的发言者。首先,您可以获得与会话直接相关的发言人名单:
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的结果。这可以通过向第二个查询添加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
(我也更改了表名和包含的反引号,我希望我抓住它们。还重新格式化查询以提高可读性。)
答案 1 :(得分:0)
通过阅读A Visual Explanation of SQL Joins以及net.tutsplus上的这篇明确的文章以及一些头发拉动来刷新我的记忆后,我能够提出一个有效的查询。
select * from speaker as spk inner join speakerFunction as spkfun on (spkfun.speaker_id = spk.id) inner join section_speakerfunction-join-table as s_spkfun on (s_spkfun.speakerFunction_id = spkfun.id) inner join section as s on (s.id = s_spkfun.section_id) inner join session as sess1 on (sess1.id = s.session_id) left join session-speaker-join-table as sess-spk on (sess-spk.speaker_id = spk.id) left join session as sess2 on (sess2.id = sess-spk.session_id) where sess-spk.session_id is null
正如你可以看到很多内连接然后左外连接能够在null session_id上过滤(where子句)。
全部谢谢!