我有本地电影院的网站,并希望在主页上增强其中一个查询。
我想选择今天有会议的所有电影。
两张桌子。一个用于电影,一个用于会话。
会话表将电影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一段时间在主页上显示带有会话的电影。
非常感谢任何帮助。
最善良,
斯科特
答案 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