Comment utiliser les alias avec MySQL gauche JOIN

ma requête originale fait des jointures en utilisant la clause WHERE plutôt que JOIN. Je me suis rendu compte que ce n'était pas retourner des films qui n'avaient pas de stars ou de genres ne se sont pas présentés donc je pense que je dois faire une gauche rejoindre afin de montrer chaque film. 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 une partie à gauche sur les films je fais certainement 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;

je ERROR 1054 (42S22): Unknown column 'sm.movie_id' in 'on clause' donc clairement je fais la jonction mal, Je ne vois pas ce que c'est.

21
demandé sur styfle 2011-10-16 01:53:39

5 réponses

ne mélangez pas l'opérateur virgule Avec JOIN - ils ont des précédents différents! Il y a même un avertissement à ce sujet dans le manuel:

cependant, la préséance de l'opérateur de virgule est moindre que celle de la jointure interne, de la jointure croisée, de la jointure gauche, et ainsi de suite. Si vous mélangez virgule joins avec les autres types de jointure quand il y a une condition jointure, une erreur du formulaire Unknown column 'col_name' in 'on clause' peut se produire. Des informations sur le traitement de ce problème sont données plus loin dans le présent rapport. section.

Essayez plutôt ceci:

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
répondu Mark Byers 2011-10-15 22:49:32

Vous devriez mettre vos conditions relatives à vos jointures dans la même clause sur. Cependant, 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
répondu Chris J 2011-10-15 22:00:08

peut-être moche, mais la façon dont il fonctionnera est ici. Attention, c'est moche et beaucoup de gens mettent en garde contre ce genre de piratage!--2-->

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;

lors de l'utilisation des jointures, vous devez faire la jointure avec la table de droite qui ont les colonnes que vous comparez.

1
répondu Vignesh 2015-06-05 13:34:49

SQL Join (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;

Gauche Rejoindre

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;

RIGHT Join

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
répondu Rahul Panwar 2017-03-02 21:33:06

utilisation d'alias connecter plusieurs tables sans utiliser join..

sélectionnez somme(S. montant total des dépenses consacrées à l'ensemble du département--2-->

à partir de salary_mas_tbl s,dept_mas_tbl d

où l'art. salary_dept=D. dept_id;

0
répondu pradip kor 2017-05-22 10:15:12