【问题标题】:is there a more efficient alternative for this SQL query?此 SQL 查询是否有更有效的替代方法?
【发布时间】:2020-05-21 15:15:06
【问题描述】:

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

表架构:

  • 电影:movie_id(PK)(int)
  • in_genre(bridge_table):movie_id(FK)(int),genre_id(int)
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

【问题讨论】:

  • 两次EXISTS() ?
  • 存在作品感谢您的建议@wildplasser, @lLukStorms

标签: sql postgresql


【解决方案1】:

如果你想要这些类型,我会这样做:

SELECT genre_id as common_genre
FROM in_genre ig
WHERE movie_id IN (0109830, 1375666)
GROUP BY genre_id
HAVING COUNT(*) = 2;

如果你想要计数,子查询很简单:

SELECT COUNT(*)
FROM (SELECT genre_id as common_genre
      FROM in_genre ig
      WHERE movie_id IN (0109830, 1375666)
      GROUP BY genre_id
      HAVING COUNT(*) = 2
     ) g;

如果您想了解有关流派的完整信息,那么我建议您exists

select g.*
from genres g
where exists (select 1
              from in_genre ig
              where ig.genre_id = g.genre_id and ig.movie_id = 0109830
             ) and
      exists (select 1
              from in_genre ig
              where ig.genre_id = g.genre_id and ig.movie_id = 1375666
             );

【讨论】:

    【解决方案2】:

    如果它只需要来自in_genre 的数据,则无需加入movie 表。

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

    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
      )
    

    【讨论】:

      猜你喜欢
      • 2011-02-28
      • 1970-01-01
      • 2018-09-15
      • 1970-01-01
      • 1970-01-01
      • 2017-03-26
      • 1970-01-01
      • 2012-03-29
      • 1970-01-01
      相关资源
      最近更新 更多