Как использовать псевдонимы с MySQL LEFT JOIN
Мой исходный запрос выполняет объединения, используя предложение WHERE, а не 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;
Я пытался сделать 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;
Я получаю ERROR 1054 (42S22): Unknown column 'sm.movie_id' in 'on clause'
, так что я неправильно делаю это, я просто не понимаю, что это такое.
Ответы
Ответ 1
Не смешивайте оператор запятой с 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;
Ответ 2
Вы должны поместить свои условия, относящиеся к вашим JOINs, в том же предложении 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;
Ответ 3
Может быть, уродливый, но способ, которым он будет работать, здесь. Остерегайтесь, что это уродливо, и многие люди предупреждают об этом виде хаков.
SELECT *
FROM movies m, stars_in_movies sm LEFT JOIN movies m1 ON m1.id = sm.movie_id, stars s
ORDER BY m.title ASC
LIMIT 5;
при использовании объединений вы должны выполнить соединение с правой таблицей, в которой есть столбцы, которые вы сравниваете.
Ответ 4
SQL Join (внутреннее соединение в MySQL)
select emp1.id,emp1.name,emp1.job from (select id, type as name, description as job from component_type as emp1)emp1
inner join
emp
on emp1.id=emp.id;
Левая регистрация
select emp1.id,emp1.name,emp1.job from (select id, type as name, description as job from component_type as emp1 where id between '1' AND '5')emp1
left join
emp
on emp1.id=emp.id;
Правый Присоединиться
select emp1.id,emp1.name,emp1.job from (select id, type as name, description as job from component_type as emp1)emp1
Right join
(select * from emp where id between '1' and '5')exe
on emp1.id=exe.id;
Ответ 5
Использование псевдонима подключает многие таблицы без использования join.
выберите сумму (s.salary_amount) как total_expenses_paid_to_all_department
from зарплата_mas_tbl s, dept_mas_tbl d
где s.salary_dept = d.dept_id;