web-dev-qa-db-fra.com

Comment utiliser les alias avec MySQL LEFT JOIN

Ma requête initiale consiste à faire des jointures à l'aide de la clause WHERE plutôt que de JOIN. J'ai réalisé que ce n'était pas le retour de films qui n'avaient pas d'étoiles ou de genres qui ne se sont pas présentés, alors je pense que je dois faire un LEFT JOIN afin de montrer tous les films. Voici mon SQL original:

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;

J'ai essayé de faire un JOINDRE GAUCHE sur des films, je suis définitivement en train de faire quelque chose de mal.

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;

J'obtiens ERROR 1054 (42S22): Unknown column 'sm.movie_id' in 'on clause' si clairement que je fais la jointure de manière erronée, je ne vois tout simplement pas ce que c'est.

21
styfle

Ne mélangez pas l'opérateur de virgule avec JOIN - ils ont une priorité différente! Il y a même un avertissement à ce sujet dans le manuel :

Toutefois, la priorité de l'opérateur de virgule est inférieure à INNER JOIN, CROSS JOIN, LEFT JOIN, etc. Si vous mélangez des jointures de virgule avec les autres types de jointure lorsqu'il existe une condition de jointure, une erreur de la forme Unknown column 'col_name' in 'on clause' peut se produire. Des informations sur la résolution de ce problème sont données plus loin dans cette section.

Essayez ceci à la place:

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;
14
Mark Byers

Vous devez placer vos conditions relatives à vos JOIN dans la même clause ON. Toutefois, pour votre problème ci-dessus, vous devez utiliser la requête suivante: 

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
Chris J

Peut-être moche, mais la façon dont cela fonctionnera est ici. Méfiez-vous c'est moche et beaucoup de gens donne des avertissements à propos de ce genre de piratage

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;

lorsque vous utilisez des jointures, vous devez faire la jointure avec la table de droite contenant les colonnes que vous comparez.

1
Vignesh

Jointure SQL (jointure interne dans 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;

Joint gauche

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;

Rejoindre à droite

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;
0
Rahul Panwar

L'utilisation d'alias connecte plusieurs tables sans utiliser la jointure. 

select sum(s.salary_amount) as total_expenses_paid_to_all_department
from salary_mas_tbl s,dept_mas_tbl d
where s.salary_dept=d.dept_id;
0
pradip kor