2009-06-14 52 views
0

MySQL设置:一步一步。MySQL - 加入再加入再加入

程序 - >连接 - >扬声器(由program_id)

在这一点上,很容易让我查询所有的数据:

SELECT * 
FROM programs 
JOIN speakers on programs.program_id = speakers.program_id 

尼斯和容易。

对我来说这个技巧就是这样。我的发言人桌子也与第三张桌子“书”联系在一起。因此,在“演讲者”表中,我有“book_id”,而在“books”表中,book_id与名称相关联。

我已经试过这(包括在那里你会发现):

SELECT * 
FROM programs 
JOIN speakers on programs.program_id = speakers.program_id 
JOIN books on speakers.book_id = books.book_id 
WHERE programs.category_id = 1 
LIMIT 5 

没有结果。

我的问题:

  1. 我在做什么错?
  2. 什么是最有效的方法来做这个查询?

基本上,我想要取回所有程序数据和书籍数据,但不是book_id,我需要它作为书名(从第3个表格)返回。

在此先感谢您的帮助。

UPDATE:
(而不是打开一个全新的问题)

的LEFT JOIN为我工作。但是,我有一个新问题。多本书可以分配给一个扬声器。

使用左连接返回两行!我需要添加什么来返回只有一行,但分开这两本书。

+0

查询对我来说看起来不错,而且这几乎是通常做你正在做的事情的方式。你确定别的东西没有错(例如,你是否试图消除WHERE子句,你确定数据库中的数据应该返回一个匹配这个等)? – 2009-06-14 03:31:45

回答

3

有没有书架表没有任何与speakers.book_id匹配的列的机会?

尝试使用左连接,即使图书中没有匹配,仍会返回程序/扬声器组合。

SELECT * 
FROM programs 
JOIN speakers on programs.program_id = speakers.program_id 
LEFT JOIN books on speakers.book_id = books.book_id 
WHERE programs.category_id = 1 
LIMIT 5 

顺便说一句,你可以发布所有表涉及的表模式,以及你期望得到什么输出(或合理的表示)?

编辑:应对运笔者评论

您可以通过使用组和GROUP_CONCAT穿上一行所有的书。

例如

SELECT speakers.speaker_id, 
     speakers.speaker_name, 
     programs.program_id, 
     programs.program_name, 
     group_concat(books.book_name) 
FROM programs 
JOIN speakers on programs.program_id = speakers.program_id 
LEFT JOIN books on speakers.book_id = books.book_id 
WHERE programs.category_id = 1 
GROUP BY speakers.id 
LIMIT 5 

注:因为我不知道确切的列名,这些可能会关闭

+0

LEFT OUTER JOIN相当于MySQL中的JOIN – baudtack 2009-06-14 03:32:43

0

这是典型的高效率。有一种你所做的假设是不正确的。您的扬声器是否分配了书籍?如果他们不是最后的JOIN应该是LEFT JOIN

这种查询通常非常高效,因为您几乎可以肯定拥有主键作为索引。主要问题是您的索引是否覆盖(如果您不使用SELECT *,而只选择需要的列,则更有可能发生这种情况)。