再次问好亲爱的溢出者,我希望我们有一些头脑可以用来挑选;一如既往,非常感谢! :)
我有一个事件表,可以分配多个类别(用作标签):
然后我有类别(存储每个标签)和 Events_Categories(链接表)
**Events**
| id | event_name |
+------------+
+ 1 | Basketball
+ 2 | Children Charity Ball
+ 3 | Bowling Charity Event
**Event_Categories** (Stores Tags / Categories)
| id | name |
+------------+
+ 1 | sport
+ 2 | charity
+ 3 | other_tag
**Events_Categories** (Linking Table)
| event_id | event_category_id |
+-------------------------------+
+ 1 | 1
+ 2 | 2
+ 3 | 1
+ 3 | 2
以上总结
Basketball => Sports
Children Charity Ball => Charity
Bowling Charity => Charity & Sports
期望的结果
我希望能够搜索“运动”标签,这将返回所有具有该标签的事件。但是,它需要返回(和分组)与该特定事件关联的所有标签。
IE 搜索“运动”标签将返回:
**Events**
| id | event_name | tags |
+---------------------------------------------+
+ 1 | Basketball | sport
+ 3 | Bowling Charity Event | sport, charity
返回没有 WHERE 条件的事件的 SQL 示例: 以下 SQL 返回所有事件并对类别(或标签)进行分组。这应该让您了解我的数据库结构,可能有助于解决问题?
SELECT e.*, group_concat(c.name) as tags
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`;
附加问题(额外加分)
你能相信吗,他需要更多帮助!! :)
此外,在链接表中,实际上还有一个字段表示事件何时链接到事件:
**Events_Categories** (Linking Table)
| event_id | event_category_id | activity_id |
+---------------------------------------------+
+ 1 | 1 | 1
+ 2 | 2 |
+ 3 | 1 | 2
+ 3 | 2 | 2
我将如何搜索事件,事件 ID 为 [x] 以返回事件详细信息,再次将所有标签分组:
链接到 2 个关联的 Activity_ID 的事件
| id | event_name | tags | activity_id |
+------------------------------------------------------------+
+ 3 | Bowling Charity Event | sport, charity | 2
再次感谢!
最佳答案
这将回答您问题的第一部分。为了获取事件中包含的所有类别的列表,您可以使用 EXISTS
来检查该事件是否至少包含您的搜索事件名称的一部分。
SELECT a.ID,
a.Event_name,
GROUP_CONCAT(c.Name)
FROM Events a
INNER JOIN Events_Categories b
ON a.ID = b.event_ID
INNER JOIN Event_Categories c
ON b.event_category_id = c.ID
WHERE EXISTS
(
SELECT 1
FROM Events_Categories d
INNER JOIN Event_Categories e
ON d.event_category_id = e.id
WHERE e.Name = 'Sport' AND
d.event_id = a.id
)
GROUP BY a.ID,
a.Event_name
更新 1
SELECT a.ID,
a.Event_name,
GROUP_CONCAT(c.Name) CategoryList,
MAX(activity_id) activity_id
FROM Events a
INNER JOIN Events_Categories b
ON a.ID = b.event_ID
INNER JOIN Event_Categories c
ON b.event_category_id = c.ID
GROUP BY a.ID, a.Event_name
HAVING MAX(activity_id) = 2
关于mysql - SQL 一对多返回 & 按搜索条件分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18047093/