MySQL:选择今天有会话的所有电影

时间:2014-07-02 11:28:16

标签: php mysql

我有本地电影院的网站,并希望在主页上增强其中一个查询。

我想选择今天有会议的所有电影。

两张桌子。一个用于电影,一个用于会话。

会话表将电影ID称为电影'。会话有一个名为sessiontime的列。电影也有自己的开始和结束日期,代表他们在电影院打开和关闭的日期。

我想要做的是列出今天至少有一个会话的所有电影。

我尝试了,但每部电影的结果与今天的会话一样多。

SELECT * FROM sessions, movies 
WHERE sessions.movie = movies.id 
AND movies.start <= '2014-07-02' AND movies.end >= '2014-07-02' 
AND sessions.sessiontime > '2014-07-02 00:00:01' 
AND sessions.sessiontime < '2014-07-02 23:59:59' 
ORDER BY movies.start ASC

从技术上讲,我们不需要检查电影的开始和结束日期 - 因为人们会认为电影院的管理员不会为不再播放的电影进行会话。但无论如何,检查真好。我主要需要检查有问题的电影是否有今天的会议。

我将在主页上使用PHP一段时间在主页上显示带有会话的电影。

非常感谢任何帮助。

最善良,

斯科特

2 个答案:

答案 0 :(得分:3)

您只需使用您的查询

即可
SELECT distinct movies.* FROM sessions, movies 

我也会使用连接而不是语法

from movies
inner join sessions on sessions.movie = movies.id

另一种方法是使用exists子句而不是连接,如果你的结果集中不需要来自连接表的任何东西

select m.*
from movies m
WHERE m.start <= '2014-07-02' AND m.end >= '2014-07-02' 
and exists (select null from sessions s
            where s.movie = m.id
            and s.sessiontime > '2014-07-02 00:00:01' 
            and s.sessiontime < '2014-07-02 23:59:59')

答案 1 :(得分:1)

首先,我要将查询切换为现代JOIN语法而不是逗号;在这种情况下,这没有任何区别,我只是觉得它更容易阅读。

实际的修复方法是GROUP BY,改变后的SELECT - 您实际上并不想知道哪些会话,只是电影,而不是SELECT *,您要列出详细信息你想要的电影(我已经猜到了几列)。为了避免多行,我们将GROUP BY所有那些列选中,意思是&#34;对于这些列的每个不同的值,只输出一行&#34;。

 SELECT movies.id, movies.name, movies.certificate
 FROM movies
 JOIN sessions
 ON sessions.movie = movies.id 
 WHERE movies.start <= '2014-07-02'
 AND movies.end >= '2014-07-02' 
 AND sessions.sessiontime > '2014-07-02 00:00:01' 
 AND sessions.sessiontime < '2014-07-02 23:59:59' 
 GROUP BY movies.id, movies.name, movies.certificate
 ORDER BY movies.start ASC