1

我有以下数据库架构:

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

如你看到的 :

演讲者直接与会话相关联。

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

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

如何让有间接会议的所有演讲者不是直接会议之一

欢迎任何帮助。

谢谢

4

2 回答 2

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 的结果。这可以通过将 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

(我还更改了表名并包含了反引号,我希望我能全部抓住它们。还重新格式化了查询以提高可读性。)

于 2013-03-18T21:28:36.690 回答
0

通过阅读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 子句)。

谢谢大家!

于 2013-03-20T01:41:32.233 回答