2009-09-08 2 views
24

У меня есть три таблицы.using where и внутреннее соединение в mysql

локаций

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

школы

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

school_locations

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

Вот таблица LOC ations содержит все местоположения приложения. Локации для школы вызываются по идентификаторам.

когда я использую запрос

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

отображает имена с типом "стра"

Но я хочу, чтобы отобразить locations.name где только school_locations имеют тип = "COUN"

я попробовал следующие запросы, но ни один из них не работает

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; 

и

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

Возможно ли использовать несколько внутренних соединений в запросах, или есть другой способ?

ответ

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

оговорка WHERE должна быть в конце заявления

+0

является кавычка необходимы Msql? –

+2

нет, но мне нравится иметь их там, это позволяет избежать проблем со странными именами таблиц или столбцов (например, select, count, a% b и т. Д.) И более надежным. – knittl

+4

Он также, к сожалению, делает запрос не ANSI-совместимым , что может вызвать проблемы, если вы попытаетесь перенести запрос в другую базу данных. Правильный способ разграничения идентификаторов - с «двойными», но MySQL не поддерживает это по умолчанию; вы должны установить ANSI_QUOTES в SQL_MODE, чтобы получить это. Конечно, тогда испортит ваш строковый литерал «страна», который должен быть написан независимо от SQL_MODE с одинарными кавычками. – bobince

2

Попробуйте это:

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" 

Вы можете присоединиться к Locations School_Locations, а затем School_Locations в школе. Это формирует набор всех связанных мест и школ, которые вы можете затем сгладить, используя предложение WHERE, для тех, чье местоположение имеет тип «страна».

0

Вы можете использовать столько, сколько объединений, как вы хотите, однако, чем больше вы используете тем больше она будет влиять на производительность

+2

, который не отвечает на его вопрос – knittl

+1

Прошу отличить, см. Последнее предложение в вопросе. Конечно, я не ответил на весь вопрос, но я чувствовал, что один из других ответов охватывает это. – baldy

+1

Но тогда в соответствии с этикеткой stackoverflow это должен быть комментарий к этому конкретному ответу. Спасибо за понимание. –

1

Попробуйте это:

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'; 
Смежные вопросы