加入和排序来自不同表的数据

时间:2018-03-19 12:36:15

标签: mysql sql

这是我的数据库结构:

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会议')

包含所有关联的关系字段。

1 个答案:

答案 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