mysql - SQL 一对多 JOIN/聚合

标签 mysql group-by one-to-many aggregate

我有一个事件表,其中包含基本信息和 Event.ID

然后我有多个类别,我将其用作“标签”。

Event_Categories (stores each 'tag')
 - id
 - name

Events_Categories (links tags to event ID)
 - event_id
 - event_category_id

我需要执行 SQL 查询,它将返回事件信息以及所有标签。

SELECT  * FROM `events`
 JOIN (`event_categories` 
 JOIN `events_categories` ON `event_categories`.`id` = `events_categories`.`event_category_id` )  
 ON `events`.`id` = `events_categories`.`event_id` 

多次返回“事件”,并带有每个单独的标签。

当我附加GROUP BY event_categories.name时,它返回不同的事件,但只显示一个标签。

我确信这里已经介绍了这一点,但搜索后,我找不到解决方案。

谢谢!

最佳答案

您想要使用group_concat()来获取类别名称列表:

SELECT e.*, group_concat(c.name)
FROM `events` e JOIN 
     `events_categories` ec
     ON e.`id` = ec.`event_id` join
     `event_categories` c
     on ec.`event_category_id` = c.`id`
group by e.`id`;

编辑:

要将此作为外部联接来获取所有事件,即使其上没有标签,只需将 join 替换为 left join:

select e.*, group_concat(c.name)
from `events` e left join 
     `events_categories` ec
     ON e.`id` = ec.`event_id` left join
     `event_categories` c
     on ec.`event_category_id` = c.`id`
group by e.`id`;

关于mysql - SQL 一对多 JOIN/聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18043757/

相关文章:

php - 为什么我无法将 CSV 文件中的新项目添加到 PHP 中 while 循环内的数组中?

mysql - 将 Numbers 文件上传到 MySQL 表中

php sql 查询为每个单独的记录返回多行,误用连接?

mysql - 在 SQL 中使用聚合值和非聚合值

java - 具有一对多多态关系的 Hibernate 映射

php - 教义 : How to unset (SET NULL) OneToMany relationship

java - @ManyToOne 和 @OneToOne 与 @EmbeddedId 的关系

php - MySQL 查询未提交到数据库,没有错误

mysql - 如何使用laravel从mysql获取价格

sql - T-SQL 中带有 PIVOT 命令的 GROUP BY 语句