2010-07-27 3 views
3

я в настоящее время следующие:MySQL Регистрация запросов (возможно два внутренних соединений)

Таблица Город:

  • идентификатор
  • имя
  • область

Таблица Поставщик:

  • идентификатор
  • имя
  • town_id

Ниже запрос возвращает количество поставщиков для каждого города:

SELECT t.id, t.name, count(s.id) as NumSupplier 
FROM Town t 
INNER JOIN Suppliers s ON s.town_id = t.id 
GROUP BY t.id, t.name 

теперь я хотел бы представить еще одну таблицу, чтобы запрос, Supplier_vehicles. Поставщик может иметь много транспортных средств:

Таблица Supplier_vehicles:

  • ID
  • supplier_id
  • vehicle_id

Теперь поле NumSupplier должен возвращать число поставщиков для каждого города которые имеют любое из данных транспортных средств (состояние IN):

fo llowing запрос будет просто вернуть поставщик, которые имеют какие-либо из данной vehicle_id:

SELECT * FROM Supplier s, Supplier_vehicles v WHERE s.id = v.supplier_id AND v.vehicle_id IN (1, 4, 6) 

Мне нужно интегрировать это с первым запросом так, что она возвращает количество поставщиков, которые имеют какие-либо из данной vehicle_id.

ответ

1
SELECT t.id, t.name, count(s.id) as NumSupplier 
FROM Town t 
INNER JOIN Suppliers s ON s.town_id = t.id 
WHERE s.id IN (SELECT sv.supplier_id 
       FROM supplier_vehicles sv 
       WHERE sv.vehicle_id IN (1,4,6)) 
GROUP BY t.id, t.name 

Или вы могли бы сделать INNER JOIN (как ваш поставщик соединения является ВНУТРЕННИЙ, но это удалит города без каких-либо поставщиков с этими транспортными средствами) и изменить COUNT(s.id) К COUNT(DISTINCT s.id)

+0

Cheers, похоже, что он работает нормально. Продолжит тестирование. – GSTAR

0

Если я правильно помню, вы можете поместить свой второй запрос в состояние LEFT OUTER JOIN.

Так, например, вы можете сделать что-то вроде

... LEFT OUTER JOIN (SELECT * FROM Suppler s, Supplier_vehicles ......) S ON s.town_id = t.id

Таким образом, вы «интегрируете» или объединяете два запроса в один. Дайте мне знать, если это сработает.

+0

Извинения, это на самом деле INNER JOIN. И это не сработало, я боюсь. – GSTAR

0
SELECT t.name, count(s.id) as NumSupplier 
FROM Town t 
LEFT OUTER JOIN Suppliers s ON t.id = s.town_id 
LEFT OUTER JOIN Supplier_vehicles v ON s.id = v.supplier_id 
WHERE v.vehicle_id IN (1,4,6) 
GROUP BY t.name 
+1

Если у поставщика имеется несколько транспортных средств, тогда ваш запрос будет считать одного и того же поставщика дважды. –

+0

Да, это, похоже, не дает правильных результатов. – GSTAR

+0

Также вы уменьшаете объединение 'поставщик_веков 'в' INNER JOIN', фильтруя на 'vehicle_id' в разделе' WHERE' –

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