gpt4 book ai didi

php - 这个 MySQL 查询是 JOIN、常规查询还是两者兼而有之?

转载 作者:行者123 更新时间:2023-11-29 09:16:51 25 4
gpt4 key购买 nike

我需要从 3 个不同的表中获取数据。我了解 JOIN 的基础知识,但是当涉及到更复杂的查询(例如使用 JOIN 从 3 个或更多表获取数据)时,我有点困惑,我只是开始编写对我有意义的查询,例如下一个:

SELECT movies.imdbID,
movies.title,
movies.year,
movie_ratings.votes,
movie_ratings.total_value,
movie_ratings_external.votes,
movie_ratings_external.total_value
FROM movies, movie_ratings_external
LEFT JOIN movie_ratings ON movie_ratings.imdbID = movie_ratings_external.imdbID
WHERE movies.imdbID = movie_ratings_external.imdbID
ORDER BY movie_ratings.votes DESC, movie_ratings_external.votes DESC
LIMIT 30

此查询有效。我从正确的表中获取选定的字段并以正确的方式排序,但我认为我混淆了一些东西(例如定期查询两个表和在两个表之间联接),并且我确信有更好/更有效的方法来完成相同的目的。

有可用的数据库极客吗?

最佳答案

稍微修改了您的查询。其他一切都非常到位。

我不太确定您所说的“常规查询”,但联接几乎是常规查询的基本部分。

在您的旧查询中,这部分FROM movie, movie_ ratings_external基本上是CROSS JOIN。将其替换为 JOIN (我使用了 LEFT JOIN 假设您总是想返回所有电影,但基本意图是在 WHERE 中进行过滤的 CROSS JOIN效率低下很多,因为您正在操纵更多的行 - 尤其是不必要的行)

这样想吧。 SELECT 中的每个 Join 语句都会返回一组行,然后将这些行与 JOIN 中的下一个表进行 JOINED。这个想法应该是尽可能在每次连接时逐步尝试过滤行,这样您就不会得到不必要的元组。这就是 ON 语句的用武之地。

已删除

SELECT 
movies.imdbID,
movies.title,
movies.year,
movie_ratings.votes,
movie_ratings.total_value,
movie_ratings_external.votes,
movie_ratings_external.total_value
FROM movies
LEFT OUTER JOIN movie_ratings_external
ON movies.imdbID = movie_ratings_external.imdbID
LEFT JOIN movie_ratings
ON movie_ratings.imdbID = movie_ratings_external.imdbID
ORDER BY movie_ratings.votes DESC, movie_ratings_external.votes DESC
LIMIT 30

希望有帮助!!

关于php - 这个 MySQL 查询是 JOIN、常规查询还是两者兼而有之?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3857080/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com