如何在MySQL中为单个电影从多个表中选择数据?

How should I select data from multiple tables for a single movie in MySQL?

提问人:MADZ 提问时间:11/16/2023 最后编辑:ADysonMADZ 更新时间:11/16/2023 访问量:58

问:

我不知道如何有效地编写一个查询,从单个电影中获取所有数据以显示在 PHP 的浏览器中

目前我有一个包含 7 个表的数据库:

电影演员流派制片人movie_actormovie_genre、movie_producer

要获取 1 部单部电影的所有信息,我目前有以下查询:

SELECT 
    movies.tmdb_id, 
    movies.budget, 
    movies.title, 
    movies.description, 
    movies.runtime, 
    movies.vote_average, 
    movies.popularity, 
    movies.backdrop_path, 
    movies.poster_path, 
    movies.released_at,
    GROUP_CONCAT(DISTINCT actors.name) AS movie_actor_names,
    GROUP_CONCAT(DISTINCT actors.poster_path) AS movie_actors_poster_path,
    GROUP_CONCAT(DISTINCT movie_actor.movie_character) AS movie_actors_character,
    GROUP_CONCAT(DISTINCT genres.name) AS movie_genre_names,
    GROUP_CONCAT(DISTINCT producers.name) AS movie_producer_names,
    GROUP_CONCAT(DISTINCT producers.poster_path) AS movie_producer_poster_path
FROM 
    movies
JOIN 
    movie_actor ON movies.id = movie_actor.movie_id
JOIN
    actors ON actors.id = movie_actor.actor_id
JOIN
    movie_genre ON movies.id = movie_genre.movie_id
JOIN 
    genres ON movie_genre.genre_id = genres.id
JOIN 
    movie_producer ON movies.id = movie_producer.movie_id
JOIN
    producers ON movie_producer.producer_id = producers.id
GROUP BY
    movies.id
HAVING 
    movies.id = 9;

我现在被困在如何有效地执行此查询上,因为我将使用 PHP 显示浏览器中返回的数据,但现在 actor 已从它的 poster_path 中分离出来,生产者也是如此。我能做得更好以及如何优化这个查询,现在感觉有点骇人听闻。我应该进行多个查询吗?应该是 1 个查询吗?

如果您对我应该学习哪些科目来进入此类查询有任何建议,请告诉我,我将不胜感激。

SQL 的MySQL

评论

0赞 Barmar 11/16/2023
如果您只想要一部电影,请使用 代替 .然后,它将在所有连接之前而不是之后过滤电影,并且它应该是有效的。WHEREHAVING
0赞 MADZ 11/16/2023
查询@Barmar好还是我应该重做?此外,我似乎无法将 GROUP BY 与 WHERE 一起使用。
0赞 Barmar 11/16/2023
我认为如果你做出这种改变是可以的。为什么不能使用?你还记得以前吗?GROUP BYWHEREGROUP BY
0赞 MADZ 11/16/2023
所以我用 WHERE 替换了 GROUP BY,它返回了基本相同的结果。我觉得每个GROUP_CONCAT的这种独特性有点骇人听闻。.我应该使用子查询吗?我读过一些关于子查询的文章,但不知道这是否是使用它的正确位置。另外,为什么现在对我来说感觉很骇人听闻,因为我想要演员和照片,现在他们分开了
2赞 nbk 11/16/2023
这与哪个PHP无关,您还需要标记YPUR数据库系统

答:

0赞 simplycoding 11/16/2023 #1

我想我知道你想做什么。我会对 、 、 和 表进行子查询,因为您正在那里进行聚合,并且您可以删除必须使用 .actorsmovie_actorsgenreproducersdistinct

然后,您可以在所有表之间联接,并使用简单的筛选器来获取,而不是对整个结果集进行聚合。wheremovie.id = 9

希望能有所帮助