2016-09-20 99 views
2

我被一个SQL查询卡住了。我知道什么要做但我不知道如何。 所以,这里是需要的方案:Sql分组查询

电影(冠军主任,年份,流派,速度);

TITLE   DIRECTOR  YEAR  GENRE  RATE 
Fight club Fincher  1999  Action  4.5 
Vertigo  Hitchock  1958  Drama  5 
Donnie darko Kelly  2001  Thriller 3.5 

视频(标题主任colloc);

TITLE   DIRECTOR COLLOC 
Fight club  Fincher  3877 
Fight club  Fincher  3878 
Vertigo  Hitchcock 5431 
Vertigo  Hitchcock 5432 
Donnie darko Kelly  9986 

租金(collocdateRent,客户dateReturn);

COLLOC  DATERENT  CUSTOMER  DATERETURN 
    3877  2016-05-02 324   2016-05-04 
    3877  2016-05-20 365   2016-05-20 
    3878  2016-04-11 876   2016-04-12 
    3878  2016-06-06 112   2016-06-08 
    ...   ...   ...   ... 
    ...   ...   ...   ... 
    9986  2016-02-24 443   2016-02-28 

这里是查询:

名单,每部电影,有多少影片被租至少两次。

(注意:商店通常有更多视频 - dvd,vhs等 - 对于每部电影)。

我的做法是这样的:我会开始用这个简单的查询

SELECT colloc, title, director, COUNT(colloc) AS rentNumber 
FROM Rent 
NATURAL JOIN Video 
GROUP BY colloc 

要显示这样的事情:

COLLOC TITLE   DIRECTOR RENTNUMBER 
3877  Fight club Fincher  2 
3878  Fight club Fincher  2 
5432  Vertigo  Hitchcock 2 
5431  Vertigo  Hitchcock 1 
9986  Donnie darko Kelly  1 

为了得到这样的:

TITLE   DIRECTOR  VIDEOSNUMBER 
Fight club  Fincher  2 
Vertigo  Hitchcock  1 
Donnie darko Kelly   0 

但我错过了最后一步,我无法适当地使用GROUP BY/HAVING。 即使使用子查询也没有成功。 我一直在尝试使用不同的方法,但我没有什么好的,所以任何提示将不胜感激。

谢谢。

编辑:注意,没有必要在查询中使用表格Movie。我把它放在那里只是为了解释一部电影可以有多个视频。 添加了表格示例。主键以粗体显示。

解决方案: 感谢您的提示,我找到了一个解决方案(说实话,这是部分原因,因为它让所有没有租用视频至少2次的电影)。 不管怎么说,那就是:

SELECT title, director, COUNT(title) AS videosNumber 
FROM (SELECT colloc, title, director, COUNT(colloc) AS rentNumber 
     FROM rent NATURAL JOIN video 
     GROUP BY colloc 
    ) X 
WHERE rentNumber > 1 
GROUP BY title 
+0

我想你应该GROUP BY TITOLO – Kasnady

+0

一般GROUP BY规则说:如果指定了GROUP BY子句,在SELECT列表中的每个列引用必须要么确定一个分组列或者是一个集合函数的参数! – jarlh

+1

添加样品表数据,生成指定的预期结果! – jarlh

回答

0

试试这个

SELECT 
-- if you want to add colloc, uncomment below 
-- r.colloc as COLLOC 
m.title as TITLE, 
m.director as DIRECTOR, 
COUNT(r.colloc) as VIDEOSNUMBER 

FROM movie m 
LEFT JOIN video v ON m.title = v.title 
LEFT JOIN rent r ON v.colloc = r.colloc 
GROUP BY TITLE 
+2

GROUP BY无效。会在更新的MySQL版本中引发错误。 (并且在旧版本中返回任意结果。) – jarlh

+0

从较新的MySQL版本中的错误中独立地输出,它输出Nebi和@unnikrishnan-r的相同结果。 – Zeno

+0

@Zeno你是否已将表名改为你的? 你能告诉我们你的错误吗? – Kasnady

0

测试它:

SELECT m.TITLE, m.DIRECTOR, COALESCE(rs.Rentnumber, 0) AS VIDEOSNUMBER 
FROM Movie AS m 
LEFT JOIN 
(
    SELECT 
     --r.colloc, -- if you want to see r.colloc 
     v.TITLE, 
     v.DIRECTOR, 
     COUNT(v.TITLE) AS Rentnumber 
    FROM Video AS v 
    LEFT JOIN Rent as r on v.colloc = r.colloc 
    GROUP BY r.colloc, v.TITLE, v.DIRECTOR 
) AS rs ON m.title = rs.title AND m.director = rs.director 
Group by m.title, m.director 
+0

这是我尝试过的解决方案之一,但VIDEOSNUMBER将包含每部电影的总租金数量,而不是租用超过一次的视频数量。 另外,不会有电影没有租用视频。 – Zeno

+0

好吧,你真的想要组中的colloc号码由 – Nebi

+0

@zeno更新了查询。没有测试过它。他们可能是MySQL中更干净的解决方案。在SQL-SERVER中,您使用Window-Functions。在MySQL中你可以尝试'Group_concat'。 – Nebi

0

与他试试下面的脚本。 您应该在GROUP BY子句中的SELECT列表中包含列。

SELECT TITLE,DIRECTOR,MIN(VIDEOSNUMBER) VIDEOSNUMBER 
FROM (
     SELECT v.colloc,v.TITLE,v.DIRECTOR ,COUNT(r.colloc) VIDEOSNUMBER  
     FROM Video v 
     LEFT JOIN Rent r on v.colloc=r.colloc 
     GROUP BY v.TITLE,v.DIRECTOR,v.colloc)t 
GROUP BY TITLE,DIRECTOR 
+0

它输出@Nebi查询的相同结果。 – Zeno

+0

尝试更新的查询.. –

+0

不是确切的输出,但我认为这是解决问题的正确方法,在from子句中“嵌套”结果表。谢谢。 – Zeno

1

尝试此查询:

SELECT t1.TITLE, 
     t1.DIRECTOR, 
     COALESCE(t2.VIDEOSNUMBER, 0) AS VIDEOSNUMBER 
FROM Movie t1 
LEFT JOIN 
(
    SELECT v.TITLE, COUNT(DISTINCT r.COLLOC) AS VIDEOSNUMBER 
    FROM Rent r 
    INNER JOIN Video v 
     ON r.COLLOC = v.COLLOC 
    GROUP BY v.TITLE 
) t2 
    ON t1.TITLE = t2.TITLE 
ORDER BY COALESCE(t2.VIDEOSNUMBER, 0) DESC