mysql - 在单个查询中选择许多项目,这些项目本身有很多项目?

标签 mysql sql database postgresql sqlite

我有一个代表图书收藏的数据库。它看起来像这样:

书籍表

id    |    title            |    year    |    author_id
--------------------------------------------------------
1       How to Read              1985            7
2       A Dream of Spring        2041            14
3       Tour Guide               2010            40

标签表

id    |    tagname
-------------------
1        nonfiction
2        fiction
3        poetry
4        sci-fi
5        magical realism
6        detective

books_tags_links 表

book    |    tag
------------------
8            4
10           1
10           4
10           5
8            2

书籍和标签之间存在一对多的关系:一本书可以有多个标签,比如“小说、侦探、科幻”。

我想知道的是:我是否可以在单个查询中选择所有书籍,与每本书关联的所有标签?我不知道结果会是什么样子——我想是一个锯齿状的数组,每本书都有不同数量的标签?

我的最终目标是输出一个 HTML 表,其中每一行都是一本书,tr 元素为给书的每个标签提供一个 data-tag 属性,这样我就可以使用 JavaScript 来隐藏或显示带有某种标签组合的书籍。到目前为止,我只能想象如何通过为列表中的每本书发出一个单独的 select tags 查询来做到这一点,但这可能意味着发出数千个数据库请求,我想知道是否有更聪明的方法。

我目前正在使用 SQLite,但如果有专用于 Postgres 或 MySQL 的解决方案,我仍然有兴趣了解它。

最佳答案

在 MySQL 中,group_concat() 可能会执行您想要的操作:

select b.*,
       group_concat(t.tagname)
from books b join
     book_tags bt
     on b.id = bt.book join
     tags t
     on bt.tag = t.id
group by b.id;

这会将标签放在一个逗号分隔的列表中,这可能是一种适合您的目的的格式。您可以使用 SEPARATOR 关键字更改分隔符。

关于mysql - 在单个查询中选择许多项目,这些项目本身有很多项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30608899/

相关文章:

mysql - 在数据可能存在或可能不存在时连接表

php - 尝试从 user_id = $_SESSION ['id' 的数据库表中进行选择时出错]

java - MyBatis:使用动态查询比较字符串值

database - 使用 Visio 自动化逆向工程数据库模型

mysql - 如何使用计数编写此 MYSQL 查询

mysql - 使用prepared语句将带有前缀的多个表移动到存档数据库,为什么这个MySQL语句无效?

php - 用于从单个数据库中的多个表中进行选择的 SQL 查询

php - MySQL 查询 : Calculate Biggest Daily/Weekly Price Increases/Decreases

mysql - SQL 查询比较同一列中但由两组不同查询返回的两个值

c# - 为什么在我调用DataAdapter.Update()时此C#代码会生成语法错误?