web-dev-qa-db-ja.com

MySQL LEFT JOINでエイリアスを使用する方法

私の元のクエリは、JOINではなくWHERE句を使用して結合を行っています。これは、スターのない映画やジャンルが表示されなかった映画を返すものではないことに気づいたので、すべての映画を表示するには、LEFT 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;
_

私は間違いなく何か間違ったことをしている映画の左に参加しようとしました。

_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'が返されるので、明らかに間違って結合を行っています。それが何なのかわかりません。

22
styfle

JOINに関連する条件を同じ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
Chris J

Mayいかもしれませんが、動作する方法はここにあります。これはいので、多くの人がこの種のハッキングについて警告していることに注意してください

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;

結合を使用する場合は、比較する列がある適切なテーブルと結合する必要があります。

1
Vignesh

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

エイリアスを使用すると、結合を使用せずに多くのテーブルを接続できます。

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