加入&对SQL结果进行分组

时间:2012-04-02 16:13:54

标签: mysql sql group-by

我正在构建一个小型影院预订系统PHP Web应用程序,

数据库有电影显示表。 (除其他外,但不重要)

显示有日期和时间,每个显示包含一个电影

电影可以有多个显示

我正在尝试构建一个将获得所有film_name,shows_date和shows_time的查询,但我想对结果进行分组,因此我在结果中没有多个影片,因为您可以在同一天。

我有这个SQL:

SELECT f.film_name, s.showing_date, s.showing_time
FROM film f, showing s
WHERE f.film_id = s.film_id
GROUP BY s.film_id

然而,它并没有显示每部电影的所有时间,只是第一部。我想有很多我错过了,也许我应该将展示时间分成一个单独的表格,但任何帮助都会非常感激。如有必要,我会提供更多信息和图表。

由于

4 个答案:

答案 0 :(得分:1)

假设每部电影需要一行,并且所有放映在同一行,请尝试:

SELECT f.film_name, group_concat(concat(s.showing_date, s.showing_time)) showings
FROM film f, showing s
WHERE f.film_id = s.film_id
GROUP BY s.film_id

答案 1 :(得分:0)

你不能做你要做的事。 结果集中的每一行只能显示一个电影名称和一个显示时间。如果电影A显示5次,那么你可以得到五行的结果集,所有列出电影A和不同的放映时间,或者如果你按电影A分组,你将只得到一个结果,它将列出第一次露面时间。

答案 2 :(得分:0)

根据你告诉我们的内容,我相信你所寻找的是将每部电影压缩成一行的一些方法,它仍然正确地列出了显示日期和时间。为此,您需要以某种不经常使用的方式将这些行折叠成一行。 Normall你会在这些行(SUM,COUNT等)上使用某种函数来提供聚合数据。但是,听起来您想要查看实际数据。

要做到这一点,这里有一个非常有用的问题: Concatenate many rows into a single text string?

第二高评级响应涉及使用XML PATH,如果您的数据库支持该功能,这可能是最干净的方式。如果没有,请查看接受的答案(COALESCE)。我建议将这种类型的代码放入一个标量函数中,该函数返回一个以逗号分隔的放映时间为您的字段。然后你可以列出一部电影,并在电影旁边有一个放映时间列表。

答案 3 :(得分:0)

对于令人困惑并且可能浪费时间而感到抱歉,我想通过将显示时间分成一个单独的表来找到解决方案。

我发现所有的电影都是在某个日期播放的,然后循环播放并根据第一个查询返回的显示ID选择这些电影的所有显示时间,因为每个电影只显示一个天。我将此信息添加到每个循环周期的第一个结果中并将整个数据传回。

可能有更好的方法,但现在这样做。 感谢