首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL: 3个表(book、author、book_author)

SQL: 3个表(book、author、book_author)
EN

Stack Overflow用户
提问于 2013-04-08 20:44:56
回答 2查看 16K关注 0票数 8

我的MySQL数据库中有3个表,它们的结构如下:

Book表:

代码语言:javascript
复制
     BOOK
---------------
book_id | title
---------------
   1    |   A
   2    |   B

作者表:

代码语言:javascript
复制
     AUTHOR
----------------
author_id | name
----------------
     1    | John
     2    | Bush
     3    | Alex
     4    | Bob

然后我有一个连接表,它在表book和author之间建立了多对多关系,这意味着一本书可以由多个作者(即合著者)编写,而一个作者可以有许多他或她已经写过的书。

代码语言:javascript
复制
    BOOK_AUTHOR
--------------------
book_id |  author_id
--------------------
   1    |     1
   1    |     2
   1    |     3
   1    |     4
   2    |     3
   2    |     4

是否可以通过SQL或MySQL让数据库管理系统输出如下内容:

代码语言:javascript
复制
 book_id |  title  |       authors
------------------------------------------
    1    |    A    | John, Bush, Alex, Bob
    2    |    B    | Alex, Bob

输出中的authors行是与特定图书关联的所有作者的串联。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-08 20:47:50

由于您使用的是MySQL,因此请使用GROUP_CONCAT()来连接每个组的行。

代码语言:javascript
复制
SELECT  a.Book_ID, 
        a.Title,
        GROUP_CONCAT(c.Name ORDER BY c.Name) Authors
FROM    Book a
        INNER JOIN book_author b
            ON a.Book_ID = b.Book_ID 
        INNER JOIn Author c
            ON b.Author_ID = c.Author_ID
GROUP   BY a.Book_ID, a.Title

  • SQLFiddle Demo
  • MySQL GROUP_CONCAT()

输出

代码语言:javascript
复制
╔═════════╦═══════╦════════════════════╗
║ BOOK_ID ║ TITLE ║      AUTHORS       ║
╠═════════╬═══════╬════════════════════╣
║       1 ║ A     ║ Alex,Bob,Bush,John ║
║       2 ║ B     ║ Alex,Bob           ║
╚═════════╩═══════╩════════════════════╝
票数 17
EN

Stack Overflow用户

发布于 2015-04-28 06:26:02

这很好地解释了如何从多对多关系和3个表中提取数据。

最重要的是,我想为Oracle员工提供一个定制的解决方案,bcz Sql和Oracle没有相同的语法,很难在网上找到……所以享受吧..。

代码语言:javascript
复制
SELECT  book.BOOK_ID, book.BOOK_TITLE, 
listagg (CONCAT(CONCAT(author.AUTHOR_FIRSTNAME, ' '),author.AUTHOR_LASTNAME), ',') 
WITHIN GROUP 
(ORDER BY author.AUTHOR_FIRSTNAME) FirstName
FROM    Books book
        INNER JOIN authorbooks ab
            ON ab.BOOKS_ID = book.BOOK_ID
        INNER JOIN Authors author
            ON ab.Author_id = author.Author_ID
GROUP BY book.BOOK_ID, book.BOOK_TITLE;

这将以正确的格式打印,包括名字和姓氏。

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

https://stackoverflow.com/questions/15879385

复制
相关文章

相似问题

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