Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql plicit和隐式连接。一些你可能想要避免的事情_Mysql_Sql_Join - Fatal编程技术网

Mysql plicit和隐式连接。一些你可能想要避免的事情

Mysql plicit和隐式连接。一些你可能想要避免的事情,mysql,sql,join,Mysql,Sql,Join,编辑: 顺便说一下,在查询C中,numActors是0,因为您的联接不正确。事实上,如果没有电影评级,那么就没有演员!如果您修复了这个问题,那么您应该得到与查询B相同的结果 SELECT m.movie_name, AVG(rating_value) AS avgRating, COUNT(actor_id) AS numActors FROM movies m LEFT JOIN movie_ratings r ON m.movie_id = r.movie_id LEFT JOIN movi

编辑:

顺便说一下,在查询C中,
numActors
是0,因为您的联接不正确。事实上,如果没有电影评级,那么就没有演员!如果您修复了这个问题,那么您应该得到与查询B相同的结果

SELECT m.movie_name, AVG(rating_value) AS avgRating, COUNT(actor_id) AS numActors
FROM movies m
LEFT JOIN movie_ratings r ON m.movie_id = r.movie_id
LEFT JOIN movie_actors a ON m.movie_id = a.movie_id -- Instead of r.movie_id = a.movie_id
GROUP BY m.movie_id;

电影。电影id
。“蓝精灵”给你起的名字真是太好了;)在MySQL中为您测试了这一点-效果很好。SQL也为我做了修改。
movie\u id
列只会在您使用
SELECT*
@ForguesR时出现一次。我刚刚注意到问题已更改,并且在我发布答案后附加了悬赏,我想我必须更新它。谢谢你让我知道。关于抛出的错误的观点很好。接下来的问题tho:如果我想做
左加入r.movie\u id=A.movie\u id
?这是可能的,还是我必须使用左连接才能做到?我不确定我是否理解?假设完整语句为
movie\u ratings r LEFT JOIN movie\u actors a ON r.movie\u id=a.movie\u id
yes,则该语句有效。错误。。。我打字打错了。我是说。。。这可以通过
使用
来完成。是。USING和ON可以互换使用,前提是两个表中的列名相同。例如,如果在一个表中它只是
id
,而在另一个表中它是
movie\u id
,您需要在t1.id=t2上使用
。movie\u id
。因此,在m.movie\u id=a.movie\u id上使用
与使用(movie\u id)
相同,在r.movie\u id=a.movie\u id上使用
与使用(movie\u id)相同
但是m.movie\u id=a.movie\u id
和r.movie\u id=a.movie\u id
不是一回事。特别是,r.movie\u id=a.movie\u id上的
不包括没有演员的电影。那又有什么好处呢?op永远不要使用自然连接或隐式连接。我想他只是想知道,如果他对隐式连接使用
use
,会发生什么。@FOrguesR-我想不管你是在进行自然连接还是连接,优先顺序都会适用。尽管我没有使用隐式联接,但我确实在问题#3中询问了它们。@ForguesR自然联接和使用的联接的行为方式相同:它们必须隐式选择两个表进行比较。MySQL文档在第一句中讨论了这两个问题,然后用一个自然连接示例来说明这一点。所以这也适用于使用。@neubert优先顺序当然适用于所有连接。结果方面,在我们的例子中,隐式连接和内部连接没有区别,即使这个顺序会改变。但是,对于外部(左/右)联接,此顺序将更改结果集:这正是查询B和C*之间发生的情况(我的答案中使用的是)。查询是正确的,查询C中的联接是按预期编写的。表和查询都是人为设计的,在这个人为设计的示例中,它可能没有多大意义,但它只是一个示例。将您建议的更改应用于查询C会使查询C和查询A相同,这对说明我的问题没有帮助。如果您真的想在毫无意义的查询C中使用
USING
,但显然不应该,那么您应该看看wolfgangwalther的答案。基本上,使用
是一种快捷方式。如果它适合你的需要,并且因为它较短而使事情更清楚,那么就使用它。如果没有,请显式地使用
左连接打开
SELECT m.movie_name, AVG(rating_value) AS avgRating, COUNT(actor_id) AS numActors
FROM movies m
LEFT JOIN movie_ratings r ON m.movie_id = r.movie_id
LEFT JOIN movie_actors a ON m.movie_id = a.movie_id
GROUP BY m.movie_id;
SELECT m.movie_name, AVG(rating_value) AS avgRating, COUNT(actor_id) AS numActors
FROM movies m
LEFT JOIN movie_ratings r USING (movie_id)
LEFT JOIN movie_actors a USING (movie_id)
GROUP BY m.movie_id;
SELECT m.movie_name, AVG(rating_value) AS avgRating, COUNT(actor_id) AS numActors
FROM movies m
LEFT JOIN movie_ratings r ON m.movie_id = r.movie_id
LEFT JOIN movie_actors a ON r.movie_id = a.movie_id
GROUP BY m.movie_id;
SELECT movie_name, AVG(rating_value) AS averageRating, COUNT(actor_id) AS numActors
FROM movies m
LEFT JOIN movie_ratings r ON m.movie_id = r.movie_id
LEFT JOIN movie_actors a ON m.movie_id = a.movie_id
GROUP BY m.movie_id;
SELECT movie_name, AVG(rating_value) AS averageRating, COUNT(actor_id) AS numActors
FROM movies m
LEFT JOIN movie_ratings USING (movie_id)
LEFT JOIN movie_actors USING (movie_id)
GROUP BY movie_id;
SELECT movie_id, AVG(rating_value) AS averageRating, COUNT(actor_id) AS numActors
SELECT m.movie_id, AVG(rating_value) AS averageRating, COUNT(actor_id) AS numActors
SELECT movie_name, AVG(rating_value), COUNT(actor_id)
FROM movies m
LEFT JOIN movie_ratings r USING (movie_id)
LEFT JOIN movie_actors a USING (movie_id)
GROUP BY m.movie_id;
SELECT m.movie_name, AVG(rating_value) AS avgRating, COUNT(actor_id) AS numActors
FROM movies m
LEFT JOIN (
  movie_ratings r 
  LEFT JOIN movie_actors a USING (movie_id)
) USING (movie_id)
GROUP BY m.movie_id
SELECT m.movie_name, AVG(rating_value) AS avgRating, COUNT(actor_id) AS numActors
FROM movies m
LEFT JOIN movie_ratings r ON m.movie_id = r.movie_id
LEFT JOIN movie_actors a ON m.movie_id = a.movie_id -- Instead of r.movie_id = a.movie_id
GROUP BY m.movie_id;