2011-10-15 47 views
18

Truy vấn ban đầu của tôi đang thực hiện các phép nối bằng mệnh đề WHERE thay vì JOIN. Tôi nhận ra rằng đây không phải là những bộ phim không có bất kỳ ngôi sao hay thể loại nào không xuất hiện nên tôi nghĩ tôi phải làm một LEFT JOIN để thể hiện mọi bộ phim. Đây là SQL gốc của tôi:Cách sử dụng bí danh với MySQL LEFT JOIN

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; 

Tôi đã cố gắng thực hiện LEFT JOIN trên phim. Tôi chắc chắn đang làm điều gì đó sai.

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; 

Tôi nhận được ERROR 1054 (42S22): Unknown column 'sm.movie_id' in 'on clause' vì vậy rõ ràng tôi đang tham gia sai, tôi không thấy nó là gì.

+1

Gaaaah. Trộn bảng 'FROM, bảng, bảng' lười biếng với các tham gia được chỉ định đầy đủ thích hợp là cực kỳ xấu xí. –

Trả lời

11

Không kết hợp toán tử dấu phẩy với JOIN - chúng có ưu tiên khác nhau! Thậm chí còn có một cảnh báo về vấn đề này trong manual:

Tuy nhiên, ưu tiên của toán tử dấu phẩy là ít hơn của INNER JOIN, CROSS JOIN, LEFT JOIN, và vân vân. Nếu bạn trộn dấu phẩy tham gia với các kiểu kết hợp khác khi có điều kiện kết nối, lỗi có dạng Unknown column 'col_name' in 'on clause' có thể xảy ra. Thông tin về xử lý vấn đề này được đưa ra sau trong phần này.

Hãy thử điều này thay vì:

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; 
+0

Tôi nghĩ rằng dòng 'AND m.title LIKE'% the% ''nên là' WHERE m.title LIKE'% the% '', phải không? – styfle

+0

Có, xin lỗi! Có 'AND' sẽ cho kết quả sai. –

+0

Có nên ở đâu VÀ khác?Ví dụ nếu tôi muốn làm tên và họ: 'JOIN stars_in_movies sm ON sm.star_id = s.id WHERE s.first_name LIKE '% Ben%' AND s.last_name LIKE '% Stiller%'' – styfle

3

Bạn nên đặt điều kiện của bạn liên quan đến câu lệnh JOIN của bạn trong cùng ON khoản. Tuy nhiên, đối với vấn đề trên của bạn, bạn nên sử dụng truy vấn sau:

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; 
1

Có thể xấu xí, Nhưng cách thức hoạt động sẽ ở đây. Hãy coi chừng đây là xấu xí và rất nhiều người dân được đưa ra cảnh báo về loại 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; 

khi sử dụng tham gia, bạn phải thực hiện tham gia với bảng bên phải có các cột bạn đang so sánh.

0

SQL Tham gia (bên tham gia trong 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; 

Left Tham

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; 

Ngay Tham

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

tất cả các ví dụ đều dựa trên tên bí danh và có bảng có tên cột khác nhau nhưng dữ liệu là các thuộc tính bằng nhau .. –

0

Sử dụng bí danh kết nối nhiều bảng mà không sử dụng tham gia ..

chọn sum (s.salary_amount) như total_expenses_paid_to_all_department

từ s salary_mas_tbl, dept_mas_tbl d

nơi s.salary_dept = d.dept_id;