2011-10-15 58 views
18

我最初的查詢是使用WHERE子句而不是JOIN進行連接。我意識到,這並不是因爲沒有任何明星或類型的電影沒有出現,所以我想我必須做一個左連接才能顯示每部電影。這是我的原始SQL:如何使用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; 

我試圖做一個左電影加入我肯定是做錯了什麼。

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'這麼清楚我做的是加入錯誤的,我只是不明白它是什麼。

+1

Gaaaah。將懶惰的'FROM table,table,table'與適當的完全指定的連接混合在一起是非常難看的。 –

回答

11

不要混合使用逗號運算符JOIN - 它們有不同的優先權!甚至還有一個在manual這個警告:

然而,逗號運算符的優先級小於INNER JOIN,CROSS JOIN,LEFT JOIN,等等。如果在存在連接條件時將逗號連接與其他連接類型混合使用,則可能會發生表格Unknown column 'col_name' in 'on clause'的錯誤。有關處理這個問題的信息在本節後面給出。

試試這個:

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

我覺得'AND m.title LIKE'這行'%''應該是'WHERE m.title LIKE'%%'',對吧? – styfle

+0

是的,抱歉!在那裏有'AND'會給出錯誤的結果。 –

+0

它應該是其他的AND嗎?例如,如果我想要做名字和姓氏:'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

你應該把你與你在同一個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; 
1

也許醜陋,但它的工作方式就在這裏。當心這是醜陋,很多人被給予使用時加入警告有關這種黑客

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; 

的,你必須做與有您要比較的列右表的連接。

0

SQL加入(在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

所有示例都基於別名,並且有表具有不同的列名,但數據是相同的屬性.. –

0

使用別名連接多臺,而無需使用連接..

SELECT SUM(s.salary_amount)作爲total_expenses_paid_to_all_department

從salary_mas_tbl S,dept_mas_tbl d

其中s.salary_dept = d.dept_id;