Подтвердить что ты не робот

Как использовать псевдонимы с 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', так что я неправильно делаю это, я просто не понимаю, что это такое.

4b9b3361

Ответ 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;