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
没有结果。
我的问题:
基本上,我想要取回所有程序数据和书籍数据,但是我需要将它作为书籍名称(来自第3张表格)而不是book_id。
提前感谢您的帮助。
更新
(而不是打开一个全新的问题)
左连接为我工作。但是,我有一个新问题。可以将多本书分配给单个扬声器。
使用左连接,返回两行!!我需要添加什么才能返回一行,但将这两本书分开。
答案 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 *
,则更有可能发生这种情况,而只选择您需要的列)。