2014-10-30 51 views
0

我正在回答有关IMDB数据库的问题,如下所示。 http://i.imgur.com/kj8qVgF.pngSQL - 在列中查找具有最高计数的对象

我需要找到哪些电视节目(这是显示为“电视连续剧”一个kind_type)拥有多数情节,演员,和季节(这是问题的不同部分)。 要开始了,我写了一个查询找到的电视节目具有最多的女演员的名字:

SELECT * 
FROM (
SELECT DISTINCT t.title, count(t.title) total 
FROM title t 
INNER JOIN kind_type k 
ON (t.kind_id = k.id) 
INNER JOIN cast_info c 
ON (c.movie_id = t.id) 
CROSS JOIN role_type r 
GROUP BY t.title 
HAVING r.role = 'actress' AND k.kind = 'tv series' 
ORDER BY total DESC 
) as newTable 
LIMIT 1 

但是,我得到的错误:

column "r.role" must appear in the GROUP 
BY clause or be used in an aggregate function 
LINE 11: HAVING r.role = 'actress' AND k.kind = 'tv series' 

所以,你可以把它想象因为有很多cast_info对象,每个对象都附加到role_type对象。每个cast_info也有一个用于movie_id的变量,并且我的目标是选择一个包含角色“actress”的role_types的所有cast_info对象列表,然后挑选出现在该列表中的最常出现的“movie_id”。

实施例: table

在这个例子中,该查询应理想地返回“3”,因为这是具有最多的女演员在电影ID。

任何提示将不胜感激。

+1

你问了很多关于你的作业的问题,在某些时候你需要自己回答他们 – Lamak 2014-10-30 19:10:14

+0

不应该由“INNER JOIN role_type r ON c.ID = r。”的“CROSS JOIN role_type r” ID”? CROSS JOINing极大地影响逻辑,因为现在角色女演员与title + kind_type + cast_info中的每个行集关联,并且这可能是错误的原因。我期望改变连接将解决你的问题,但我自己会把你在WHERE子句中的HAVING子句中。 – 2014-10-31 00:58:52

回答

1

这是一个简单的修复,可能只是您的错误。

您收到错误是因为您在HAVING子句中放置了一个常规条件。 HAVING用于有关集合函数的条件。

例如,如果你试图用一个总大于2只选择行,您使用具有:

HAVING total > 2 

但是,你要需要在WHERE子句中去的。试试这个:

SELECT * 
FROM (
    SELECT DISTINCT t.title, count(t.title) total 
    FROM title t 
    INNER JOIN kind_type k 
    ON (t.kind_id = k.id) 
    INNER JOIN cast_info c 
    ON (c.movie_id = t.id) 
    JOIN role_type r 
    ON (r.id = c.role_id) 
    WHERE r.role = 'actress' AND k.kind = 'tv series' 
    GROUP BY t.title 
    ORDER BY total DESC 
    ) as newTable 
LIMIT 1 

这是关于HAVING条款的更多信息。

+1

哦,我明白了。这真是愚蠢的我。感谢您的链接! – 2014-10-31 04:02:55

+0

@joeBalin没问题,对这个项目好运。 – AdamMc331 2014-10-31 04:27:27

相关问题