MariaDB / MySQL电影数据显示为每日时间表 - 4个时间段

时间:2018-03-27 13:27:52

标签: mysql sql database pivot schedule

我有一个电影表,其中showtime从网络订阅源读入MySQL。该表的格式为:

**id  film             date         time**
1    Lady Bird       2017-03-27   13:40:00
2    I, Tonya        2017-03-27   15:40:00
3    I, Tonya        2017-03-27   17:00:00
4    Lady Bird       2017-03-27   20:00:00
......

我需要格式化它,以便有4个时间段(14:00,14:00-17:00,17:00-19:00,19:00之后)。因此得到的数据将是:

film      morning     afternoon     evening    night
Lady Bird   13:40                    17:00
I, Tonya                15:40                   20:00

我使用了以下查询来设置列中的时间:

SELECT 
     film,
     CASE WHEN time < "14:00" THEN time END AS morning, 
     CASE WHEN time BETWEEN "14:00" AND "17:00" THEN time END AS afternoon,
     CASE WHEN time BETWEEN "17:00" AND "19:00" THEN time END AS evening,
     CASE WHEN time >= "19:00" THEN time END AS night 
FROM 
     `films` 
WHERE 
     date=date(now())

但是,结果是每次都有一个单独的记录:

Film         morning      afternoon    evening     night
Lady Bird    13:40          null         null       null
I, Tonya     null          15:40         null       null
I, Tonya     null           null        17:00       null
Lady Bird    null           null         null      20:00

是否有办法让每部电影记录合并为一个时间在正确的位置:

Lady Bird    13:40        null       17:00      null

如果我按名称分组,则只显示每部影片丢弃其余部分的第一次

1 个答案:

答案 0 :(得分:0)

是的,按电影汇总,并采用当前CASE表达式的最大值。这会将几张唱片折叠成每部电影的一张唱片。

SELECT 
    film,
    MAX(CASE WHEN time < "14:00" THEN time END) AS morning, 
    MAX(CASE WHEN time BETWEEN "14:00" AND "17:00" THEN time END) AS afternoon,
    MAX(CASE WHEN time BETWEEN "17:00" AND "19:00" THEN time END) AS evening,
    MAX(CASE WHEN time >= "19:00" THEN time END) AS night 
FROM films
WHERE
    date = CURDATE()
GROUP BY
    film;