2009-09-08 10 views
24

Ich habe drei Tabellen.mit where und inner join in mysql

Standorte

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

Schulen

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

school_locations

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

Hier ist der Tisch loc ations enthält alle Standorte der Anwendung. Standorte für Schulen werden mit IDs aufgerufen.

Wenn ich die Abfrage

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

zeigt es Namen mit dem Typ "coun"

Aber ich will locations.name anzuzeigen, in dem nur school_locations type = "coun" haben

i versuchte folgende Abfragen, aber keine scheint zu funktionieren

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; 

und

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"; 

ist es möglich, mehrere innere Joins in Abfragen zu verwenden, oder gibt es einen anderen Weg?

Antwort

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

die WHERE-Klausel am Ende der Anweisung

+0

werden die Backticks in msql benötigt? –

+2

Nein, aber ich mag sie dort zu haben, es vermeidet Probleme mit seltsamen Tabellen- oder Spaltennamen (zB wählen, zählen,% b, etc.) und ist idiotensicher – knittl

+4

Es macht auch die Abfrage leider nicht-ANSI-konform , die möglicherweise Probleme verursachen, wenn Sie versuchen, die Abfrage in eine andere Datenbank zu migrieren. Die richtige Art der Begrenzung von Bezeichnern ist mit "doublequotes", aber MySQL unterstützt dies standardmäßig nicht; Sie müssen ANSI_QUOTES in SQL_MODE setzen, um das zu bekommen. Das vermasselt dann natürlich Ihr String-Literal "coun", das unabhängig von SQL_MODE mit einfachen Anführungszeichen geschrieben werden sollte. – bobince

2

Versuchen, dies sein:

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" 

Sie können Orte zu School_Locations verbinden und dann School_Locations in der Schule. Dies bildet eine Menge aller verwandten Orte und Schulen, die Sie dann mit der WHERE-Klausel auf diejenigen verteilen können, deren Standort vom Typ "coun" ist.

0

Sie können so viele verwenden Joins, wie Sie wollen, aber je mehr Sie die mehr verwenden wird es Auswirkungen auf die Leistung

+2

, die seine Frage nicht beantwortet – knittl

+1

Ich bitte um zu unterscheiden, siehe den letzten Satz in der Frage. Sicher, ich habe die ganze Frage nicht beantwortet, aber ich fühlte, dass eine der anderen Antworten das bedeckte. – baldy

+1

Aber dann nach stackoverflow Etikette sollte dies ein Kommentar zu dieser bestimmten Antwort sein. Danke für Ihr Verständnis. –

1

Try this:

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