带有视图的SQL查询

时间:2013-03-18 21:08:12

标签: mysql sql

我有以下数据库架构:

schema 高分辨率图片在这里http://s18.postimage.org/mlyw5gea1/schema2.png

如你所见:

发言人直接与会话相关联。

一个部分直接与会话相关联。

扬声器通过speakerFunction与一个部分间接关联,然后是secion_speakerfunction-join-table直到该部分。

如何让间接会话的所有发言人都不是直接会议之一

欢迎任何帮助。

由于

2 个答案:

答案 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子句)。

全部谢谢!