У меня есть интересный вопрос - мне нужен точный обратный оператор JOIN.
У меня есть таблица под названием счета-фактуры, а другая таблица называется платежами. Я хочу получить по порядку счета-фактуры, к которым вообще не прикреплены никакие платежи, но за которыми следуют строки, к которым после этого прикреплены платежи.
* Таблица 1004 * счетов имеет следующие поля:
- ID
- CustomerID
- 1012 * Отметка времени *
Таблица платежей
имеет следующие поля:
Не все платежи являются полными суммами, поэтому к каждому счету может быть прикреплено несколько платежей.
Я хочу, чтобы сначала выставлялись неоплаченные счета-фактуры (без платежей), затем следовали счета-фактуры с частичными, но не полными платежами, а затем с последующими полностью оплаченными счетами.
Я хочу выполнить это, не выполняя отдельные запросы SQL, если смогу - я бы предпочел, чтобы это был один запрос, чтобы я мог выплюнуть один раз. Есть идеи?
- ОБНОВЛЕНО -
На основании ответа от DCP я обновил метод запроса. Я работал до тех пор, пока мне не нужно было добавить этот оператор JOIN для упорядочения по моей таблице sub_to_inv, которая выглядит следующим образом:
идентификатор подписки
0 12 18
1 13 18
2 14 19
и т.д..
Поэтому, основываясь на этом, я придумал это (добавил LIMIT в конце ограничения на страницы ..)
SELECT i.id AS id, i.modify_date as modify_date, s.subscription as subscriptionid, 0 paidratio FROM invoices i
LEFT JOIN sub_to_inv s ON i.id=s.invoice
WHERE NOT EXISTS (SELECT id FROM payments p WHERE p.invoice=i.id) AND i.corporation='3' AND i.payer=1
UNION ALL
SELECT i.id AS id, i.modify_date as modify_date, s.subscription as subscriptionid, p.paid/i.total AS paidratio FROM invoices i,
(SELECT p.invoice, sum(amount) AS paid FROM payments p GROUP BY p.invoice) p
LEFT JOIN sub_to_inv s ON i.id=s.invoice
WHERE p.invoice=i.id AND i.corporation='3' AND i.payer=1
AND p.paid UNION ALL
SELECT i.id AS id, i.modify_date as modify_date, s.subscription as subscriptionid, p.paid/i.total AS paitratio FROM invoices i,
(SELECT p.invoice, sum(amount) AS paid FROM payments p WHERE p.invoice=id GROUP BY p.invoice) p
LEFT JOIN sub_to_inv s ON i.id=s.invoice
WHERE p.invoice = i.id AND i.corporation='3' AND i.payer=1
AND p.paid=i.total
ORDER BY paidratio DESC, modify_date DESC, subscriptionid ASC LIMIT 0,40
Я получаю ошибку "i.id column not found", которую не получаю. В каждом блоке операторов, которые в конечном итоге объединяются с помощью оператора UNION, я указываю invoices i
, чтобы гарантировать, что i.id ссылается на идентификатор счетов-фактур. tab.e