2013-08-18 3 views
0

У меня есть две таблицы со следующими полями:
...
Как выбрать из одной таблицы, где разница с (суммой) из другой таблицы?

orders.orderID 
orders.orderValue 

и

payments.orderID 
payments.payVal 

В payments.payVal там будут постепенные выплаты по каждому заказу (многие к одному).
Что мне нужно, поэтому выберите ВСЕ заказы от orders, где есть оплата, оставленная (orders.orderValue - ((sum)payments.payVal) > 0).

Единственное, что я могу подойти прямо сейчас, это (foreach), используя orderID, но я не могу этого сделать по определенным причинам. Я также не могу добавить столбец внутри таблицы, чтобы сохранить значение по некоторым причинам.

Что мне нужно, чтобы выполнить весь выбор в одном SQL Query что-то, что напоминает эту идею: SELECT * FROM orders WHERE <... each(orderValue - (sum(payVal))) > 0 ...>

ответ

1
SELECT *, SUM(p.payVal) AS TotalPayed 
FROM orders o 
LEFT JOIN payments p ON o.orderID = p.orderID 
GROUP BY o.orderID 
HAVING SUM(p.payVal) < o.orderValue 

Это должно предоставить вам необходимые поля, хотя я бы посоветовал вам выбрать конкретные полей с этим запросом.

LEFT JOIN гарантирует, что вы получите каждый заказ, даже если платеж еще не сделан.

SQL Fiddle

+0

Если вы не нуждаетесь в 'TotalPayed' поле, вы можете просто использовать ' SELECT * FROM [...] '. –

-1

Похоже, мы пришли к такому же решению,

http://sqlfiddle.com/#!2/9a657/18

SELECT * FROM `orders` 
LEFT JOIN `payments` AS p ON `orders`.`orderID` = p.`orderID` 
GROUP BY `orders`.`orderID` 
HAVING SUM(p.`payVal`) <= 0 
+0

Мне нравятся оба решения, ваши и @Marty McVry ... в основном то же самое. Но, по некоторым причинам интеграции, я буду использовать ваш синтаксис. (Я автоматизировал свои sql-запросы, и процесс автоматизации лучше подходит вашему синтаксису). Из Марти я узнал что-то интересное ... спасибо. – derei

+0

На самом деле, этот запрос получает только то, что общая сумма уже выплачена меньше или равна 0 ... Это не совсем то, что нужно здесь ... (Итак, они не то же самое ...) Попробуйте выполнить мой запрос на примеры данных в этом скрипте SQL. –