我有一个电影表,其中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
如果我按名称分组,则只显示每部影片丢弃其余部分的第一次
答案 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;