Проблема: В результирующем выводе при LEFT JOIN количество строк, в тех таблицах в которых строк меньше, будет увеличено до наибольшего количества строк. Поясню. Есть 3 таблицы: user: id - пользователи invoice: user_id, amount - списание баланса transaction: user_id, amount - списание и пополнение баланса Задача: выбрать пользователей с положительным балансом. Делаю это запросом: Код (Text): SELECT user.id, sum(transaction.amount) - sum(invoice.amount) as balance FROM user LEFT JOIN invoice ON invoice.user_id = user.id LEFT JOIN transaction ON transaction.customer_id = user.id GROUP BY user.id HAVING balance >0 Допустим есть следующие исходные данные: user: 1 invoice: user_id | amount 1 | 50 transaction: customer_id | amount 1 | -10 1 | 50 1 | 60 В результате запроса таблица invoice приджойнится 3 раза, что приводит к тому что у пользователя списание баланса будет не 50, а 150. Аналогичная ситуация может быть и когда в инвойсах больше строк чем в транзакциях. Сейчас вижу возможность сделать это 2-мя запросами: Код (Text): SELECT user.id, -1 * sum(invoice.amount) as balance FROM user LEFT JOIN invoice ON invoice.user_id = user.id GROUP BY user.id Код (Text): SELECT user.id, sum(transaction.amount) as balance FROM user LEFT JOIN transaction ON transaction.customer_id = user.id GROUP BY user.id сделать по ним UNION и дальше работать с результатом. Выглядит ужасно криво. По сему прошу совета. Единственное ограничение - нет возможности изменить структуру таблиц.
Пфф..ну так и делайте, через UNION. Еще можно сделать через коррелированные подзапросы, но это еще то уродство.
SELECT user.id, ifnull(q1,0) - ifnull(q2,0) as balance FROM user LEFT JOIN (select user_id, sum(invoice.amount) as q1 from invoice group by user_id) t1 ON t1.user_id = user.id LEFT JOIN (select customer_id, sum(transaction.amount) as q2 from transaction group by customer_id) t2 ON t2.customer_id = user.id where ifnull(q1,0) - ifnull(q2,0) > 0;