2011-10-15 11 views
18

La mia query originale sta eseguendo join utilizzando la clausola WHERE anziché JOIN. Mi sono reso conto che non si trattava di restituire film che non presentavano stelle o generi, quindi penso di dover fare un SINISTRA SINISTRA per mostrare ogni film. Ecco il mio SQL originale:Come utilizzare gli alias con 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; 

Ho provato a fare un SINISTRA SINISTRO sui film Sto sicuramente facendo qualcosa di sbagliato.

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; 

ho ERROR 1054 (42S22): Unknown column 'sm.movie_id' in 'on clause' così chiaramente io sto facendo il join sbagliato, io non vedo quello che è.

+1

Gaaaah. Mescolare il pigro 'DA tavolo, tavolo, tavolo' con giunzioni correttamente specificate è ultra-brutto. –

risposta

11

Non utilizzare l'operatore virgola con JOIN - hanno precedenza diversa! C'è anche un avvertimento di questo nel manual:

Tuttavia, la precedenza l'operatore virgola è inferiore di INNER JOIN, CROSS JOIN, LEFT JOIN, e così via. Se si mescolano i join virgola con gli altri tipi di join quando è presente una condizione di join, potrebbe verificarsi un errore del modulo Unknown column 'col_name' in 'on clause'. Le informazioni su come affrontare questo problema sono fornite più avanti in questa sezione.

Prova a modificare:

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

Penso che la riga 'AND m.title LIKE '% the%'' dovrebbe essere 'WHERE m.title LIKE '% the%'', giusto? – styfle

+0

Sì, mi dispiace! Avere "AND" ci darà il risultato sbagliato. –

+0

Dovrebbe essere DOVE per l'altro AND?Ad esempio, se desidero fare il nome e il cognome: "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

Si dovrebbe mettere le condizioni relative al vostro join nella stessa clausola ON. Tuttavia, per il problema di cui sopra, è necessario utilizzare la seguente query:

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

Forse brutto, ma il modo in cui funzionerà è qui. Attenzione questo è brutto e molta gente sta dando avvertimento circa questo tipo di hack

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; 

quando si utilizza entra a far parte, è necessario effettuare il join con la tabella di destra che hanno le colonne si sta confrontando.

0

SQL Registrazione (inner 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; 

LEFT JOIN

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; 

destro registrazione

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

tutti gli esempi sono basati sul nome alias e ci sono tabelle con un nome di colonna diverso ma i dati sono proprietà uguali. –

0

Usando alias collegare molti tavolo senza usare unirsi ..

somma selezionare (s.salary_amount) come total_expenses_paid_to_all_department

da s salary_mas_tbl, dept_mas_tbl d

dove s.salary_dept = d.dept_id;