MySQL Join Query (возможно два внутренних объединения) - PullRequest
3 голосов
/ 27 июля 2010

У меня сейчас есть следующее:

Столовый городок:

  • ID
  • имя
  • регион

Стол Поставщик:

  • ID
  • имя
  • 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. У поставщика может быть много транспортных средств:

Стол Поставщика_автомобили:

  • ID
  • supplier_id
  • vehicle_id

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

Следующий запрос просто вернет поставщиков, у которых есть любой из указанных 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.

Ответы [ 3 ]

1 голос
/ 27 июля 2010
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 (так как ваш поставщик - INNER, но это приведет к удалению городов без поставщиков с этими транспортными средствами) и изменить COUNT(s.id) TO COUNT(DISTINCT s.id)

0 голосов
/ 27 июля 2010
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
0 голосов
/ 27 июля 2010

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

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

... СЛЕВАЯ ВНЕШНЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ * ИЗ ПОСТАВЩИКОВ, ПОСТАВЩИКОВ ...) ВКЛ

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

...