首页 > 解决方案 > 此 SQL 查询是否有更有效的替代方法?

问题描述

我正在研究一个电影数据集,该数据集包含电影、流派表和 in_genre 桥接表。以下查询尝试查找两部电影之间的共同类型。我做了两个连接来获取流派列表和一个相交来找到常见的流派。有没有更有效的方法?

表架构:

SELECT count(*) as common_genre 
FROM(
    // getting genres of first movie
    SELECT in_genre.genre_id
    FROM movie INNER JOIN in_genre ON movie.id = in_genre.movie_id
    WHERE movie.id = 0109830

    INTERSECT

    // getting genres of second movie
    SELECT in_genre.genre_id
    FROM movie INNER JOIN in_genre ON movie.id = in_genre.movie_id
    WHERE movie.id = 1375666
) as genres

标签: sqlpostgresql

解决方案


如果只需要其中的数据,in_genre则无需加入movie表。

您可以使用 anEXISTS来查找常见的流派。

SELECT COUNT(DISTINCT genre_id) as common_genre
FROM in_genre ig
WHERE movie_id = 0109830
  AND EXISTS 
  (
      SELECT 1
      FROM in_genre ig2
      WHERE ig2.movie_id = 1375666
        AND ig2.genre_id = ig.genre_id
  )

推荐阅读