我有一个具有这种结构的表:
电影:
id | date_entered_theater | date_left_theater
我想写一个查询,每天返回剧院中的电影数量。当date_entered_theater
列不为空且date_left_theater
列为空时,电影就在剧院中。
日期列使用datetime
格式,查询应返回如下数据:
date moviesInTheater
2014-09-22 | 5
2014-09-23 | 6
2014-09-24 | 8
2014-09-25 | 7
我不确定如何编写此查询。我尝试了以下方法:
SELECT DATE(date_entered_theater), COUNT(*) as moviesInTheater
FROM movies
GROUP BY DATE(date_entered_theater)
HAVING date_entered_theater IS NOT NULL AND date_left_theater IS NULL
ORDER BY date_entered_theater ASC
导致错误[Err] 1054 - Unknown column 'date_left_theater' in 'having clause'
我也不认为上述查询是正确的,因为它按date_entered_theater
分组并且不考虑date_left_theater
,这意味着电影可能会离开影院当天没有电影进入剧院,这种变化不会反映在结果集中。
我可以在MySQL中做什么?
答案 0 :(得分:2)
您的有条件检查应位于WHERE
而不是HAVING
只有基于聚合函数的条件才应该在HAVING子句中。
SELECT DATE(date_entered_theater), COUNT(*) as moviesInTheater
FROM movies
WHERE date_entered_theater IS NOT NULL AND date_left_theater IS NULL
GROUP BY DATE(date_entered_theater)
ORDER BY date_entered_theater ASC
编辑:如果您需要查找在任何特定日期播放的电影数量,您可能需要如下所示的电影。我有空的时候会尝试发一个小提琴。
SET @num = -1;
SELECT
date_sequence,
COUNT(m.id) as moviesInTheater
FROM movies as m
JOIN (SELECT DATE_ADD( '2014-09-01',
interval @num := @num+1 day) AS date_sequence
HAVING DATE_ADD('2014-09-01', interval @num day) <= '2014-09-25') as dt
ON m.date_entered_theater >=dt. date_sequence
GROUP BY dt.date_sequence
答案 1 :(得分:1)
首先,您需要一个表格,其中包含您所关注的时间范围内的所有日期(例如,一年)。您无法使用其他表格,因为您无法确保列movies.date_entered_theater
列中存在所有日期。
您可以使用自己喜欢的编程语言填充循环。
假设此表存在,名为movies_daily
并且有一列day
为主键。
如果当前日期是电影进入剧院的日期和离开剧院的日期之间,那么电影就在剧院中。
如果电影离开影院的日期为空,则电影仍然在影院中:
SELECT
movies_daily.day
, COUNT(*) AS moviesInTheater
FROM
movies_daily
LEFT JOIN movies
ON movies_daily.day >= movies.date_entered_theater
AND (movies_daily.day < movies.date_left_theater
OR movies.date_left_theater IS NULL)
GROUP BY
movies_daily.day
ORDER BY
movies_daily.day