2013-08-04 49 views
2

我有一个活动表,带基本信息和Event.IDSQL一个一对多的加入/总

然后我有多个类别,其中我使用的“标签”。

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

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

谢谢!

回答

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`; 

编辑:

要做到这一点作为一个外连接来获取所有事件,即使有上没有标签,只需更换与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`; 
+0

真棒&感谢编辑。然而,如果你不介意的话,还有更多的大脑选择。当我添加一个WHERE子句('e.id = x')时,它会按照预期返回特定的事件和所有标记。但是当我使用c.name IN(“any”,“tag”)标记名进行搜索时,它会返回事件,但不是与该事件相关的所有标记,只有我搜索的标记,如果这有意义的话?谢谢 – BigDistance

+0

@BigDistance。 。 。如果在标签名称上添加一个“where”子句,那么您将只获得这些标签。如果你想获得所有具有一定标签集合的事件,那就问另一个问题,因为这与这个问题完全不同。 –

+0

好的,感谢您的帮助@ gorden-linoff。无论如何,最好这些都是分开的功能。我已经发布了一个新的Q:[link](http://stackoverflow.com/questions/18047093/) – BigDistance