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。
提前谢谢你的帮助。
更新:
(而不是提出一个全新的问题)
左边的加入对我来说很有效。然而,我有一个新的问题。多本书可以分配给一位发言者。
使用左联接,返回两行!!我需要添加什么才能只返回一行,但将这两本书分开。
发布于 2009-06-14 03:30:37
books表是否有可能没有与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顺便说一句,您能否为所有涉及的表发布表模式,以及您期望得到的具体输出(或合理的表示)?
编辑:对op作者评论的响应
您可以使用group和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注意:由于我不知道确切的列名,所以这些名称可能会取消
发布于 2009-06-14 03:33:15
这通常是有效的。你所做的一些假设是不正确的。你的演讲者有指定的书吗?如果他们不这样做,那么最后一个JOIN应该是一个LEFT JOIN。
这种查询通常是非常有效的,因为您几乎肯定有主键作为索引。主要问题是索引是否覆盖(如果不使用SELECT *,而是只选择所需的列,则更有可能发生这种情况)。
https://stackoverflow.com/questions/992072
复制相似问题