Mysql查找重复项

时间:2011-03-12 09:03:38

标签: mysql

已经获得了学校的任务,事情一直很顺利,但我必须做的一个问题让我难过。以下是两个表的说明:

电影:MovieId,[pk] Title,Year,DirectorCode [fk]

导演:DirectorCode,[pk]姓名

我要做的是找到任何重新制作自己电影的导演,并显示电影的名称,导演的名字以及第一次和第二次发行的年份?

即使你不想给我答案,我也会非常感谢一些提示

谢谢

2 个答案:

答案 0 :(得分:1)

假设重拍具有不同的movieId,但它将具有相同的标题。因此,您可以找到具有相同标题和相同directorCode的电影。

使用GROUP BY查找所有具有COUNT(标题)>的电影1将为您提供要搜索的directorCode和标题,然后在第二个查询中使用它从两部电影(第一次和第二次重拍)中取出完整信息,因为信息将在GROUP BY中丢失。另一种选择是选择MAX(年),MIN(年)来找出第一年和第二年。

如果允许使用“HAVING”关键字,以便通过聚合过滤组,但是我不记得这是mysql专有还是ANSI SQL的一部分。

答案 1 :(得分:1)

您不需要使用having或子查询,甚至GROUP。只要假设电影和重制标题相同,您就可以在一个查询中执行此操作。由于它们是重拍,我认为标题将与不同的年份相同(否则,你如何识别重拍?你需要另一个领域)。

SELECT
   name
   , m1.title
   , m1.year
   , m2.year as remake
FROM
   Movie m1
   JOIN Director d USING (directorcode)
   JOIN Movie m2 ON (
      d.directorcode = m2.directorcode
      AND m1.title = m2.title
      AND m1.year < m2.year
   )

从电影到导演和导演到电影的内部连接再次确保只有在两部电影上有相同的导演才能获得结果。然后,比较标题(这也可以在WHERE子句中完成)。出于组织目的,选择m1小于m2(也可以在WHERE子句中)。否则,'翻拍'可能是较早的。

有一点需要注意的是,如果导演重拍两次电影,你会获得三排。例如。如果他们在2010年和2011年重拍了一部2009年的电影,那么你将获得一个年份= 2009年,翻拍= 2010年,年= 2009年,翻拍= 2011年,年份= 2010年,翻拍= 2011年。从问题的背景来看,它看起来导演只会重拍一部电影。

我对此进行了测试,并且不会显示由不同导演重制或根本不重新制作的电影的结果。如果两位导演两次重拍同一部电影(三次重拍,两次来自另一位导演),你将获得这两位导演。我认为这是可取的。