sty*_*fle 22 mysql sql join left-join
我的原始查询是使用WHERE子句而不是JOIN进行连接.我意识到这并没有让那些没有任何明星或类型的电影没有出现,所以我想我必须做一个LEFT JOIN来展示每部电影.这是我原来的SQL:
SELECT *
FROM movies m, stars s, stars_in_movies sm, genres g, genres_in_movies gm
WHERE m.id = sm.movie_id
AND sm.star_id = s.id
AND gm.genre_id = g.id
AND gm.movie_id = m.id
AND m.title LIKE '%the%'
AND s.first_name LIKE '%Ben%'
ORDER BY m.title ASC
LIMIT 5;
Run Code Online (Sandbox Code Playgroud)
我试图对电影进行LEFT JOIN我肯定做错了.
SELECT *
FROM movies m, stars s, stars_in_movies sm, genres g, genres_in_movies gm
LEFT JOIN movies m1 ON m1.id = sm.movie_id
LEFT JOIN movies m2 ON m2.id = gm.movie_id
AND sm.star_id = s.id
AND gm.genre_id = g.id
ORDER BY m.title ASC
LIMIT 5;
Run Code Online (Sandbox Code Playgroud)
我ERROR 1054 (42S22): Unknown column 'sm.movie_id' in 'on clause'很清楚我正在加入错误,我只是看不出它是什么.
Mar*_*ers 14
不要混淆逗号运算符JOIN- 它们具有不同的优先级!手册中甚至有关于此的警告:
但是,逗号运算符的优先级小于INNER JOIN,CROSS JOIN,LEFT JOIN等.如果在存在连接条件时将逗号连接与其他连接类型混合,则
Unknown column 'col_name' in 'on clause'可能会出现表单错误.有关处理此问题的信息将在本节后面给出.
试试这个:
SELECT *
FROM movies m
LEFT JOIN (
stars s
JOIN stars_in_movies sm
ON sm.star_id = s.id
) ON m.id = sm.movie_id AND s.first_name LIKE '%Ben%'
LEFT JOIN (
genres g
JOIN genres_in_movies gm
ON gm.genre_id = g.id
) ON gm.movie_id = m.id
WHERE m.title LIKE '%the%'
ORDER BY m.title ASC
LIMIT 5;
Run Code Online (Sandbox Code Playgroud)
您应该将与 JOIN 相关的条件放在同一个 ON 子句中。但是,对于上述问题,您应该使用以下查询:
SELECT *
FROM movies m
LEFT JOIN stars_in_movies sm ON sm.movie_id = m.id
JOIN stars s ON sm.star_id = s.id
LEFT JOIN genres_in_movies gm ON gm.movie_id = m.id
JOIN genres g ON gm.genre_id = g.id
ORDER BY m.title ASC
LIMIT 5;
Run Code Online (Sandbox Code Playgroud)