it-swarm.com.de

Verwendung von Aliases mit MySQL LEFT JOIN

Meine ursprüngliche Abfrage führt Verknüpfungen mit der WHERE-Klausel anstelle von JOIN durch. Mir wurde klar, dass dies keine Filme war, die keine Stars oder Genres hatten, oder dass die Genres nicht auftauchten. Ich denke, ich muss einen LEFT JOIN machen, um jeden Film zu zeigen. Hier ist meine ursprüngliche 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;

Ich habe versucht, LEFT JOIN in Filmen zu machen. Ich mache definitiv etwas falsch.

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;

Ich bekomme ERROR 1054 (42S22): Unknown column 'sm.movie_id' in 'on clause' so klar, dass ich die Verknüpfung falsch mache, ich sehe einfach nicht, was es ist.

21
styfle

Mischen Sie den Kommaoperator nicht mit JOIN - sie haben unterschiedliche Prioritäten! Es gibt sogar eine Warnung darüber im manual :

Der Kommaoperator hat jedoch Vorrang vor INNER JOIN, CROSS JOIN, LEFT JOIN usw. Wenn Sie bei einer Join-Bedingung Komma-Joins mit den anderen Join-Typen mischen, kann ein Fehler des Formulars Unknown column 'col_name' in 'on clause' auftreten. Informationen zum Umgang mit diesem Problem finden Sie weiter unten in diesem Abschnitt.

Versuchen Sie es stattdessen:

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

Sie sollten Ihre Bedingungen in Bezug auf Ihre JOINs in derselben ON-Klausel angeben. Für Ihr Problem sollten Sie jedoch die folgende Abfrage verwenden: 

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

Vielleicht hässlich, aber so wird es funktionieren. Vorsicht, das ist hässlich und viele Leute warnen vor dieser Art von Hacks

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;

wenn Sie Joins verwenden, müssen Sie den Join mit der rechten Tabelle ausführen, die die Spalten enthält, die Sie vergleichen.

1
Vignesh

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

Links beitreten

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;

Rechts beitreten

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

Mit Alias ​​verbinden Sie viele Tabellen ohne Join. 

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