首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL --加入然后再加入再加入

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

Stack Overflow用户
提问于 2009-06-14 03:25:13
回答 2查看 165关注 0票数 0

MySQL设置:一步一步。

->链接到->扬声器的程序(由program_id编写)

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

代码语言:javascript
复制
SELECT * 
FROM programs 
JOIN speakers on programs.program_id = speakers.program_id

又好又轻松。

对我来说诀窍是这个。我的演讲桌也链接到第三张桌子,“书籍”。因此,在“扬声器”表中,我有" book_id“,而在”图书“表中,book_id链接到一个名称。

我尝试过这样做(包括一个你会注意到的地方):

代码语言:javascript
复制
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表)返回,而不是book_id。

提前谢谢你的帮助。

更新:

(而不是提出一个全新的问题)

左边的加入对我来说很有效。然而,我有一个新的问题。多本书可以分配给一位发言者。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-06-14 03:30:37

books表是否有可能没有与speakers.book_id匹配的列?

尝试使用一个左联接,它仍然将返回程序/扬声器组合,即使在书中没有匹配。

代码语言:javascript
复制
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将所有书籍放在一行。

例如:

代码语言:javascript
复制
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

注意:由于我不知道确切的列名,所以这些名称可能会取消

票数 3
EN

Stack Overflow用户

发布于 2009-06-14 03:33:15

这通常是有效的。你所做的一些假设是不正确的。你的演讲者有指定的书吗?如果他们不这样做,那么最后一个JOIN应该是一个LEFT JOIN

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/992072

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档