2011-10-15 20 views
18

Mi consulta original realiza uniones utilizando la cláusula WHERE en lugar de JOIN. Me di cuenta de que no se trataba de devolver películas que no tenían estrellas o no aparecían los géneros, así que creo que tengo que hacer una unión IZQUIERDA para mostrar cada película. Aquí está mi original de SQL:Cómo usar 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; 

Se ha intentado realizar un LEFT JOIN en películas definitivamente estoy haciendo algo mal.

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; 

consigo ERROR 1054 (42S22): Unknown column 'sm.movie_id' in 'on clause' tan claramente lo estoy haciendo la unión mal, yo no veo lo que es.

+1

Gaaaah. Mezclar el perezoso 'FROM table, table, table' con uniones apropiadas y completamente especificadas es ultra-feo. –

Respuesta

11

No mezcle el operador de coma con JOIN - ¡tienen diferente precedencia! Hay incluso una advertencia sobre esto en el manual:

Sin embargo, la precedencia del operador coma es menor que de INNER JOIN, CROSS JOIN, LEFT JOIN, y así sucesivamente. Si mezcla comas se une con los otros tipos de combinación cuando hay una condición de unión, puede producirse un error del formulario Unknown column 'col_name' in 'on clause'. La información sobre cómo lidiar con este problema se brinda más adelante en esta sección.

Tal vez puedas probar:

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

Creo que la línea 'AND m.title LIKE '% the%'' debería ser 'WHERE m.title LIKE '% the%'', ¿no? – styfle

+0

¡Sí, lo siento! Tener 'AND' dará el resultado incorrecto. –

+0

¿Debería ser DONDE para el otro AND?Por ejemplo, si quiero hacer mi nombre y apellido: 'JOIN stars_in_movies sm ON sm.star_id = s.id WHERE en el primer nombre LIKE '% Ben%' Y en el último nombre LIKE '% Stiller%'' – styfle

3

Usted debe poner sus condiciones relacionadas con su une a la misma cláusula ON. Sin embargo, para su problema anterior, se debe utilizar la siguiente consulta:

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

Tal feo, pero la forma en que va a funcionar está aquí. Cuidado con esto es feo y mucha gente está dando alerta sobre este tipo de 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; 

cuando se utiliza une, debe hacer la unión con la tabla de la derecha, que tiene las columnas que se están comparando.

0

SQL Join (combinación interna en 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; 

combinación izquierda

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; 

derecho de Ingreso

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

todos los ejemplos se basan en el nombre del alias y hay una tabla con un nombre de columna diferente, pero los datos son propiedades iguales. –

0

El uso de alias de conectar muchos tabla sin usar unirse ..

select sum (s.salary_amount) como total_expenses_paid_to_all_department

de s salary_mas_tbl, dept_mas_tbl d

donde s.salary_dept = d.dept_id;