我目前正在开发一个使用PHP和mysql的网络应用程序,允许管理员添加电影和放映时间。
电影院有3个不同的剧院:剧院1,剧院2和剧院3。
我在梳理多个放映时遇到问题。
这是我的“table_showtimes”。
movie day_start day_end showtime theatre
Hobbit 2014-01-01 2014-01-10 16.00 1
Hobbit 2014-01-08 2014-01-14 18.00 1
如你所见,电影“霍比特人”将于1月1日至1月10日下午4点在剧院1播放 从1月8日到1月14日也是在剧院1的下午6点。
现在,我想为用户显示以下前端视图,按时间顺序排序:
HOBBIT
01/01 - 07/01 16.00 Theatre 1
08/01 - 10/01 16.00 + 18.00 Theatre 1
11/01 - 14/01 18.00 Theatre 1
我在显示组合的showimtes(16.00 + 18.00)时遇到了困难。
你认为我应该循环一个月的每一天并检查可用的放映时间或通过SQL排序吗?
非常感谢您的建议! 的Matthias
答案 0 :(得分:0)
将GROUP_CONCAT放在一起放置你的放映时间。
我把它设置成小提琴:http://sqlfiddle.com/#!2/f8e40/32/0
基本上你需要开始一种枚举所有日子的方法,例如:
SELECT (day_start + INTERVAL numbers.number DAY) as DAY
FROM (
SELECT min(day_start) AS day_start,
max(day_end) AS day_end
FROM showtimes
) AS daterange
JOIN (
SELECT (u.number + 10*t.number + 100*h.number) AS number
FROM number AS u
JOIN number AS t
JOIN number AS h
ORDER BY number
) AS numbers
WHERE numbers.number <= datediff(day_end, day_start)
然后你将它加入到你的showtimes表中,以获得每天一行的结果集。
SELECT day,
movie,
GROUP_CONCAT(date_format(showtime,'%H:%i')
ORDER BY showtime
SEPARATOR ' + ') AS showtimes,
theatre
FROM showtimes AS s
JOIN (
/* the query enumerating the days */
) AS d
ON d.day BETWEEN s.day_start AND s.day_end
GROUP BY day,movie, theatre
了解GROUP_CONCAT如何在GROUP BY的上下文中工作?
GROUP_CONCAT(date_format(showtime,'%H:%i')
ORDER BY showtime
SEPARATOR ' + ') AS showtimes
特别说明:我必须创建一个包含0到9整数的表格编号,以使日期枚举生效。