SQL一对多JOIN / Aggregate

时间:2013-08-04 14:02:20

标签: 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时,它会返回不同的事件,但只显示一个标记。

我确信这已经涵盖在这里,但搜索,我找不到解决方案。

谢谢!

1 个答案:

答案 0 :(得分:4)

您想使用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`;