2009-09-08 7 views
24

J'ai trois tables.using where et jointure interne dans mysql

emplacements

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

écoles

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

school_locations

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

Voici la table loc ations contient tous les emplacements de l'application. Les localisations pour l'école sont appelées par ID.

quand j'utilise la requête

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

il affiche les noms de type "Coun"

Mais je veux afficher locations.name où seuls ont school_locations type = "Coun"

i essayé les requêtes suivantes, mais aucune ne semble fonctionner

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; 

etEst-il possible d'utiliser plusieurs jointures internes dans les requêtes, ou y a-t-il une autre manière?

Répondre

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 clause WHERE doit être à la fin de la déclaration

+0

sont les contre-apostrophes nécessaires dans msql? –

+2

non, mais je les aime là, il évite les problèmes avec des noms de table ou de colonne étranges (par exemple select, count, a% b, etc.) et est plus infaillible – knittl

+4

Il rend aussi malheureusement la requête non-ANSI , provoquant potentiellement des problèmes si vous essayez de migrer la requête vers une autre base de données. La bonne façon de délimiter les identifiants est avec "doublequotes", mais MySQL ne supporte pas cela par défaut; vous devez définir ANSI_QUOTES dans SQL_MODE pour l'obtenir. Bien sûr, cela met alors en erreur votre chaîne littérale "coun", qui devrait être écrite avec des guillemets simples indépendamment de SQL_MODE. – bobince

2

Essayez ceci:

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" 

Vous pouvez vous joindre à School_Locations Locations puis School_Locations à l'école. Cela forme un ensemble de tous les emplacements et les écoles connexes, que vous pouvez ensuite modifier en utilisant la clause WHERE à ceux dont l'emplacement est de type «coun».

0

Vous pouvez utiliser autant de jointures que vous voulez, mais, plus vous utilisez le plus, il aura un impact sur les performances

+2

qui ne répond pas à sa question – knittl

+1

Je ne suis pas d'accord, voir la dernière phrase de la question. Bien sûr, je n'ai pas répondu à toute la question, mais j'ai senti que l'une des autres réponses couvrait cela. – baldy

+1

Mais alors, selon l'étiquette de stackoverflow cela devrait être un commentaire à cette réponse particulière. Merci de votre compréhension. –

1

Essayez ceci:

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'; 
Questions connexes