首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对于此SQL查询,是否有更有效的替代方案?

对于此SQL查询,是否有更有效的替代方案?
EN

Stack Overflow用户
提问于 2020-02-05 16:40:34
回答 1查看 71关注 0票数 1

我正在开发一个电影数据集,其中包含电影表、体裁表和桥接表in_genre。下面的查询试图在两部电影之间找到常见的类型。我做了两个联接,以获得类型列表和一个相交,以找到共同的类型。有没有更有效的方法?

表模式:

电影: movie_id(PK)(int)

  • in_genre(bridge_table):movie_id(Int)(Int),genre_id(int)

代码语言:javascript
运行
复制
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
EN

回答 1

Stack Overflow用户

发布于 2020-02-05 16:56:32

如果你想要体裁,我只想:

代码语言:javascript
运行
复制
SELECT genre_id as common_genre
FROM in_genre ig
WHERE movie_id IN (0109830, 1375666)
GROUP BY genre_id
HAVING COUNT(*) = 2;

如果要计数,子查询就足够简单了:

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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
             );
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60080333

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档