MySQL - 加入然后加入然后再加入

时间:2009-06-14 03:25:13

标签: mysql join

MySQL设置:一步一步。

程序 - >链接到 - >发言者(通过program_id)

此时,我很容易查询所有数据:

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

很好,也很容易。

对我来说就是这个诀窍。我的扬声器表也链接到第三个表“书籍”。所以在“发言人”表中,我有“book_id”,而在“书籍”表中,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. 进行此查询的最有效方法是什么?
  3. 基本上,我想要取回所有程序数据和书籍数据,但是我需要将它作为书籍名称(来自第3张表格)而不是book_id。

    提前感谢您的帮助。

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

    左连接为我工作。但是,我有一个新问题。可以将多本书分配给单个扬声器。

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

2 个答案:

答案 0 :(得分:3)

有没有机会书籍表没有任何匹配的speaker.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 by和group_concat将所有书籍放在一行上。

e.g。

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

注意:由于我不知道确切的列名,因此可能会关闭

答案 1 :(得分:0)

这通常很有效率。你所做的某种假设并非如此。您的扬声器是否分配了书籍?如果他们不是最后JOIN应该是LEFT JOIN

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