如何根据列值返回行并按日期分组?

时间:2014-09-25 19:24:40

标签: mysql sql

我有一个具有这种结构的表:

电影:

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中做什么?

2 个答案:

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