这是我的数据库结构:
table: events
id
title
category_id
table: categories
id
name
table: promoters
id
name
avatar
table: dates
id
startdate
enddate
每个活动都可以有一个类别和许多促销员,日期。
然后对于日期和推广人我使用两个数据透视表:
table: event_promoter
id
event_id
promoter_id
table: event_date
id
event_id
date_id
我需要使用按日期排序的促销员和类别字段检索所有事件(仅采用日期>今天日期)。寻找查询帮助。
更新示例
两件事:
Table Events
id | title | category_id
1 | StackOverflow Meeting | 1
2 | Easter Party | 2
Table Categories
id | name
1 | Festival
2 | Professional
Table Promoters
id | name | Avatar
1 | Joe Smith | file1.jpg
2 | Frank White| file2.jpg
3 | Mike Red | file3.jpg
Table Dates
id | start | end
1 | 01-24-2018 | 01-27-2018
2 | 04-24-2018 | 04-27-2018
3 | 04-18-2018 | 04-19-2018
table: event_promoter
id | event_id | promoter_id
1 | 1 | 1
2 | 1 | 3
3 | 2 | 2
table: event_date
id | event_id | date_id
1 | 1 | 1
2 | 1 | 2
3 | 2 | 3
我的查询需要有第一个“复活节聚会”,因为日期(id:3),然后在我的活动列表中我:
('复活节','StackOverflow会议')
包含所有关联的关系字段。
答案 0 :(得分:1)
首先,您需要在事件表中引用类别,方法是在events表中添加category_id列。 此外,您在event_promoter和event_dates中不需要id列。删除该列并将其余两列作为主键。
然后,最简单的方法是通过内连接:
select events.id, events.title,
categories.name as category,
GROUP_CONCAT(dates.startdate separator ',') as startdate,
GROUP_CONCAT(dates.enddate separator ',') as enddate,
GROUP_CONCAT(promoters.name separator ',') as promoter,
GROUP_CONCAT(promoters.avatar separator ',') as avatar
from events
inner join categories on events.category_id = categories.id
inner join event_dates on events.id = event_dates.event_id
inner join dates on event_dates.date_id = dates.id
inner join event_promoter on events.id = event_promoter.event_id
inner join promoters on event_promoter.promoter_id = promoters.id
where dates.startdate > now()
group by events.id
order by dates.startdate