2012-01-13 5 views
1

У меня есть набор из нескольких таблиц (раздели обзор):MySQL: несколько выборок, несколько соединений?

Brand; 
+--------------------+--------------+------+-----+---------+-------+ 
| Field    | Type   | Null | Key | Default | Extra | 
+--------------------+--------------+------+-----+---------+-------+ 
| id     | tinyint(10) | NO | PRI | NULL |  | 
| name    | varchar(255) | NO |  | NULL |  | 
+--------------------+--------------+------+-----+---------+-------+ 

Relations; 
+--------------------+--------------+------+-----+---------+-------+ 
| Field    | Type   | Null | Key | Default | Extra | 
+--------------------+--------------+------+-----+---------+-------+ 
| id1    | tinyint(10) | NO | PRI | NULL |  | 
| id2    | tinyint(10) | NO | PRI | NULL |  | 
+--------------------+--------------+------+-----+---------+-------+ 

Country; 
+--------------------+--------------+------+-----+---------+-------+ 
| Field    | Type   | Null | Key | Default | Extra | 
+--------------------+--------------+------+-----+---------+-------+ 
| id     | tinyint(10) | NO | PRI | NULL |  | 
| name    | varchar(255) | NO |  | NULL |  | 
+--------------------+--------------+------+-----+---------+-------+ 

City; 
+--------------------+--------------+------+-----+---------+-------+ 
| Field    | Type   | Null | Key | Default | Extra | 
+--------------------+--------------+------+-----+---------+-------+ 
| id     | tinyint(10) | NO | PRI | NULL |  | 
| name    | varchar(255) | NO |  | NULL |  | 
+--------------------+--------------+------+-----+---------+-------+ 

Каждая строка имеет уникальный идентификатор. Каждая строка в таблице бренда имеет отношение к стране и городу. Соотношения между этими таблицами хранятся в таблице «Отношения», поэтому в таблице отношений для каждой строки бренда есть две строки.

Я пытаюсь получить фирменное наименование, название страны и название города для данного идентификатора торговой марки. Я могу выбрать эти отношения по отдельным выборам, но моя цель - сделать это (если возможно) в одном запросе.

Я могу получить один из соотношений (страна), но я хочу, чтобы получить город, а также:

SELECT Brand.name as brand, Country.name as country 
FROM Brand 
LEFT JOIN _relations 
ON Relations.id1 = Brand.id 
INNER JOIN Country 
ON Country.id = Relations.id2 
WHERE Brand.id = '123456'; 

Результат:

+-----------+-------------+ 
| brand  | country  | 
+-----------+-------------+ 
| brandname | countryname | 
+-----------+-------------+ 

Моя цель состоит в том, чтобы:

+-----------+-------------+-------------+ 
| brand  | country  | city  | 
+-----------+-------------+-------------+ 
| brandname | countryname | cityname | 
+-----------+-------------+-------------+ 

Может ли кто-нибудь помочь мне с этим или указать мне в правильном направлении?

ответ

0

Подключить таблицу снова под другим псевдонимом.

Что-то вроде этого:

SELECT Brand.name as brand, Country.name as country, City.name as city 
FROM Brand 
LEFT JOIN Relations ON Relations.id1 = Brand.id 
INNER JOIN Country ON Country.id = Relations.id2 
LEFT JOIN Relations r2 ON r2.id1 = Brand.id 
LEFT JOIN City ON City.id = r2.id2 
WHERE Brand.id = '123456'; 
0

В принципе вы присоединиться к отношениям, а затем снова использовать, чтобы получить город, так что-то вроде

SELECT Brand.name as brand, Country.name as country, City.Name as City 
FROM Brand 
LEFT JOIN _relations relCountry 
ON relCountry.id1 = Brand.id 
INNER JOIN Country 
ON Country.id = relCountry.id2 
LEFT JOIN _relations relCity 
ON relCity.id1 = Brand.id 
INNER JOIN City 
ON City.id = relCity.id2 
+0

Великий, спасибо, что был идеальным решением. Однако я столкнулся с новой проблемой. Что делать, если город не существует для бренда. Теперь он возвращает 0 строк, если ни один идентификатор города не найден в таблице отношений. Есть ли способ игнорировать соединение и возвращать null или, возможно, настраиваемое значение для поля City? Вместо результата я хочу получить название бренда, название страны и пустое поле города. – Tod

+0

Наружное соединение вместо внутреннего. –

Смежные вопросы