2015-04-15 3 views
0

У меня есть вопрос относительно использования UNION ALL и INNER JOIN. Я нашел несколько сообщений по этой проблеме, например here или there, но мне не удалось применить ее к моей проблеме. То, что я пытаюсь сделать, - это перечислить 1) продукты и 2) разницу между заказами и поставками. У меня есть 3 таблицы:mysql INNER/LEFT JOIN with UNION ALL

  • продукт (номер, имя)
  • заказов (идентификатор, продукт, стоимость)
  • поставки (идентификатор, продукт, стоимость)

мне удалось получить (почти), что я хочу с помощью следующего:

SELECT product 
,  sum(total) 
FROM (
SELECT product 
,  SUM(value) as total 
FROM orders 
GROUP BY product 
union all 
SELECT product 
,  -1 * SUM(value) as total 
FROM deliveries 
GROUP BY product) 
as alias 
GROUP BY product 
ORDER BY sum(total) DESC 

я получаю следующее:

  • -23
  • -33

Когда я хотел бы получить:

  • компьютер 23
  • автомобиль 33

Значение названия продукта вместо идентификатор продукта. У кого-нибудь есть решение? (Мой INNER JOIN или LEFT JOIN попытки не увенчались успехом до сих пор) Спасибо и считает

ответ

0

Регистрация в таблице продукта:

SELECT p.name, sum(total) 
FROM (SELECT o.product, SUM(o.value) as total 
     FROM orders o 
     GROUP BY o.product 
     union all 
     SELECT d.product, -1 * SUM(d.value) as total 
     FROM deliveries d GROUP BY d.product 
    ) od JOIN 
    product p 
    on od.product = p.id 
GROUP BY p.name 
ORDER BY sum(total) DESC  
+0

Спасибо Гордон. Это именно то, что мне нужно. Я должен подробно проанализировать этот процесс. Потому что теперь я пытаюсь добавить ограничение «WHERE» с использованием поставщика (продукт таблицы содержит фактически «поставщика») и сдерживает выбор в стране поставщика. Используя простой WHERE p.supplier = 1, я могу получить продукты поставщика 1. Но как я могу получить продукты страны 1. Я пытаюсь использовать INNER JOIN, но без успеха – NALL

+0

@NALL. , , Вы должны задавать новые вопросы как вопрос, а не комментарии. Не забудьте указать образцы данных и желаемые результаты. –