Как использовать псевдонимы с MySQL LEFT JOIN

18

Мой исходный запрос выполняет объединения, используя предложение 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' , так что я ошибаюсь, я просто не понимаю, что это такое.

    
задан styfle 15.10.2011 в 23:53
источник
  • Гаааа. Смешивание ленивой таблицы FROM, таблицы, таблицы с правильными полностью определенными соединениями является ультра-уродливым. –  Marc B 15.10.2011 в 23:57

5 ответов

11

Не смешивайте оператор запятой с 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;
    
ответ дан Mark Byers 15.10.2011 в 23:57
  • Я думаю, что строка AND m.title LIKE '% the%' должна быть WHERE m.title LIKE '% the%', правильно? –  styfle 16.10.2011 в 00:26
  • Да, извините! И И даст неправильный результат. –  Mark Byers 16.10.2011 в 00:32
  • Должно ли это быть ГДЕ для другого И? Например, если я хочу сделать имя и фамилию: JOIN stars_in_movies sm ON sm.star_id = s.id WHERE s.first_name LIKE '% Ben%' AND s.last_name LIKE '% Stiller%' –  styfle 16.10.2011 в 00:36
  • @styfle: Нет. Я даже не думаю, что это действительно SQL, чтобы писать WHERE. –  Mark Byers 16.10.2011 в 00:39
  • @styfle: Я перенес это условие в другое место, которое, как я сейчас думаю, имеет больше смысла. –  Mark Byers 16.10.2011 в 00:50
3

Вы должны поместить свои условия, относящиеся к вашим 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;
    
ответ дан Chris J 16.10.2011 в 00:00
1

Может быть, уродливый, но способ, которым он будет работать, здесь. Остерегайтесь, что это уродливо, и многие люди предупреждают об этом виде хаков.

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;

при использовании объединений вы должны выполнить соединение с правой таблицей, в которой есть столбцы, которые вы сравниваете.

    
ответ дан Vignesh 05.06.2015 в 15:34
0

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;
    
ответ дан Rahul Panwar 02.03.2017 в 22:01
  • все примеры основаны на имени псевдонима, и в таблице есть другое имя столбца, но данные являются равными свойствами. –  Rahul Panwar 02.03.2017 в 22:03
0
  

Использование псевдонима подключает многие таблицы без использования join.

выберите сумму (s.salary_amount) как total_expenses_paid_to_all_department

from зарплата_mas_tbl s, dept_mas_tbl d

, где s.salary_dept = d.dept_id;

    
ответ дан pradip kor 22.05.2017 в 12:15