0

我有三张桌子:

ActorInfo(actorID, firstname, lastname)
CastInfo(movieID, actorID)
GenreInfo(movieID, genre)

我正在尝试编写一个 SQL 查询,该查询将返回演员的详细信息,以及他们主演的“戏剧”电影的数量,而不会重复。

所以,理想情况下,我会有类似的东西,

1 George Clooney 10
2 Brad Pitt 8
3 Matt Damon 6

所以,到目前为止我的代码如下:

SELECT actorinfo.actorID, actorinfo.firstname, actorinfo.lastname, COUNT(DISTINCT actorinfo.actorID) as total
FROM actorinfo
LEFT OUTER JOIN castinfo
ON actorinfo.actorID= castinfo.actorID
LEFT OUTER JOIN genreinfo
ON castinfo.mvID = genreinfo.mvID
WHERE genreinfo.genre = 'Drama'
GROUP BY actorinfo.actorID, actorinfo.firstname, actorinfo.lastname
ORDER BY total ASC;

但是,这只是为所有参与者返回 1 的“总计”结果。我真的在这里碰壁了,我不确定如何解决这个特殊问题。

4

4 回答 4

1

只需删除您正在计数的列上的不同值。

SELECT actorinfo.actorID, 
actorinfo.firstname, 
actorinfo.lastname, 
COUNT(actorinfo.actorID) as total
FROM ActorInfo as actorinfo
LEFT OUTER JOIN CastInfo as castinfo
ON actorinfo.actorID= castinfo.actorID
LEFT OUTER JOIN GenreInfo as genreinfo
ON castinfo.mvID = genreinfo.mvID
WHERE genreinfo.genre = 'Drama'
GROUP BY actorinfo.actorID
ORDER BY total ASC;

http://sqlfiddle.com/#!2/29364/6

您不想计算组中 id 值的不同出现次数,因为您要分组的 id 显然在组中始终具有相同的值。或者,您可以对genreinfo 的id 和actor 的id 进行分组,并计算组内的所有记录,这更容易解释。

SELECT actorinfo.actorID, 
actorinfo.firstname, 
actorinfo.lastname, 
COUNT(*) as total
FROM ActorInfo as actorinfo
LEFT OUTER JOIN CastInfo as castinfo
ON actorinfo.actorID= castinfo.actorID
LEFT OUTER JOIN GenreInfo as genreinfo
ON castinfo.mvID = genreinfo.mvID
WHERE genreinfo.genre = 'Drama'
GROUP BY genreinfo.mvId,actorinfo.actorID
ORDER BY total ASC;

如果您有与特定电影相关的信息,我想那会转到演员和流派之间关系所在的 castinfo。在这种情况下,您应该执行以下操作以避免重复,

SELECT actorinfo.actorID, 
actorinfo.firstname, 
actorinfo.lastname, 
COUNT(DISTINCT castinfo.movie_name) as total
FROM ActorInfo as actorinfo
LEFT OUTER JOIN CastInfo as castinfo
ON actorinfo.actorID= castinfo.actorID
LEFT OUTER JOIN GenreInfo as genreinfo
ON castinfo.mvID = genreinfo.mvID
WHERE genreinfo.genre = 'Drama'
GROUP BY genreinfo.mvId,actorinfo.actorID
ORDER BY total ASC;

http://sqlfiddle.com/#!2/aa4363/1

于 2013-10-08T07:21:10.527 回答
0

按以下方式尝试查询。希望这有效...

SELECT actorinfo.actorID, actorinfo.firstname, actorinfo.lastname, COUNT(actorinfo.actorID) as total FROM actorinfo 
LEFT OUTER JOIN castinfo
ON actorinfo.actorID= castinfo.actorID
LEFT OUTER JOIN genreinfo
ON castinfo.mvID = genreinfo.mvID
WHERE genreinfo.genre = 'Drama'
GROUP BY actorinfo.actorID, actorinfo.firstname, actorinfo.lastname
ORDER BY total ASC;
于 2013-10-08T07:12:42.527 回答
0

如果没有您的数据模型的详细知识,就会有一些猜测。这应该提供“没有重复”的可靠电影计数。但是,如果一个演员可以针对一部电影多次列出(例如,如果在那部电影中扮演多个角色),则可能只有必要。

SELECT
        actorinfo.actorID
      , actorinfo.firstname
      , actorinfo.lastname
      , COUNT(DISTINCT castinfo.mvID) AS total /* distinct of movie id's */
FROM ActorInfo AS actorinfo
LEFT OUTER JOIN CastInfo AS castinfo
        ON actorinfo.actorID = castinfo.actorID
LEFT OUTER JOIN GenreInfo AS genreinfo
        ON castinfo.mvID = genreinfo.mvID
WHERE genreinfo.genre = 'Drama'
GROUP BY 
        actorinfo.actorID
      , actorinfo.firstname
      , actorinfo.lastname
ORDER BY
        total ASC
      , actorinfo.firstname
      , actorinfo.lastname
;
于 2013-10-08T07:34:46.650 回答
0

对于 Sql-Server 2005 及更高版本(小提琴演示):

;With CTE as (
   Select c.actorID, count(distinct c.movieID) mCount
   From CastInfo c 
      join GenreInfo g on c.movieID = g.movieID
   Where g.genre = 'Drama'
   Group by c.actorID
)
Select a.actorID, a.firstName, a.lastName, coalesce(cte.mCount,0) total
from actorInfo a
      left join cte on a.actorID = cte.actorID
Order by total
于 2013-10-08T07:36:06.430 回答