2009-09-08 21 views
24

Tengo tres tablas.usando donde y unión interna en mysql

localizaciones

ID | NAME | TYPE | 
1 | add1 | stat | 
2 | add2 | coun | 
3 | add3 | coun | 
4 | add4 | coun | 
5 | add5 | stat | 

escuelas

ID | NAME 
1 | sch1  
2 | sch2 
3 |sch3 

school_locations

ID |LOCATIONS_ID |SCHOOL_ID 
1 | 1   |1 
2 | 2   |2 
3 | 3   |3 

Aquí el loc mesa contiene todas las ubicaciones de la aplicación. Las ubicaciones para la escuela se llaman por ID.

cuando se utiliza la consulta

select locations.name from locations where type="coun"; 

que muestra los nombres con el tipo "coun"

Pero Quiero mostrar locations.name donde sólo tienen school_locations type = "coun"

i intentó siguientes consultas, pero ninguno parece estar funcionando

select locations.name 
from locations 
where type="coun" 
inner join school_locations 
    on locations.id=school_locations.location_id 
inner join schools 
    on school_locations.school.id=schools.id; 

y

select locations.name 
from locations 
inner join school_locations 
    on locations.id=school_locations.location_id 
inner join schools 
    on school_locations.school.id=schools.id where type="coun"; 

¿es posible usar múltiples combinaciones internas en las consultas, o hay otra manera?

Respuesta

45
SELECT `locations`.`name` 
     FROM `locations` 
INNER JOIN `school_locations` 
     ON `locations`.`id` = `school_locations`.`location_id` 
INNER JOIN `schools` 
     ON `school_locations`.`school_id` = `schools_id` 
    WHERE `type` = 'coun'; 

la cláusula WHERE tiene que estar al final de la declaración

+0

están los acentos abiertos necesarios en msql? –

+2

no, pero me gusta tenerlos allí, evita problemas con nombres extraños de tabla o columna (por ejemplo, seleccionar, contar, a% b, etc.) y es más infalible – knittl

+4

También, lamentablemente, hace que la consulta no sea compatible con ANSI , lo que podría causar problemas si intenta migrar la consulta a otra base de datos. La forma correcta de delimitar identificadores es con "dobles comillas", pero MySQL no admite esto por defecto; tienes que establecer ANSI_QUOTES en SQL_MODE para obtener eso. Por supuesto, eso arruina la cadena literal "coun", que debe escribirse sin tener en cuenta SQL_MODE con comillas simples. – bobince

2

Prueba esto:

SELECT Locations.Name, Schools.Name 
FROM Locations 
INNER JOIN School_Locations ON School_Locations.Locations_Id = Locations.Id 
INNER JOIN Schools ON School.Id = Schools_Locations.School_Id 
WHERE Locations.Type = "coun" 

Usted puede unirse a ubicaciones School_Locations y luego School_Locations a la escuela. Esto forma un conjunto de todas las ubicaciones y escuelas relacionadas, que luego puede ampliar utilizando la cláusula WHERE para aquellos cuya ubicación es del tipo "coun".

0

Puede usar tantos se une como desee, sin embargo, cuanto más se utiliza más se va a afectar al rendimiento

+2

que no responde a su pregunta – knittl

+1

Disiento a diferir, vea la última oración en la pregunta. Claro que no respondí toda la pregunta, pero sentí que una de las otras respuestas lo cubría. – baldy

+1

Pero de acuerdo con la etiqueta stackoverflow esto debería ser un comentario a esa respuesta en particular. Gracias por entender. –

1

Prueba esto:

SELECT 
    (
     SELECT 
      `NAME` 
     FROM 
      locations 
     WHERE 
      ID = school_locations.LOCATION_ID 
    ) as `NAME` 
FROM 
    school_locations 
WHERE 
    (
     SELECT 
      `TYPE` 
     FROM 
      locations 
     WHERE 
      ID = school_locations.LOCATION_ID 
    ) = 'coun';