Добрый день! Есть две таблицы sale и pay sale id_sale | summa | ----------+-----------| 1 | 10000 | ----------+-----------| 2 | 13000 | ----------+-----------| 3 | 11000 | ----------+-----------| pay id_pay | id_sale | summa | ----------+----------+-----------| 1 | 1 | 2000 | ----------+----------+-----------| 2 | 1 | 2000 | ----------+----------+-----------| 3 | 2 | 13000 | ----------+----------+-----------| 4 | 3 | 11000 | ----------+----------+-----------| Необходимо выбрать строки из таблицы sale где сумма строк из таблицы pay меньше суммы из таблицы sale Подскажите как сделать такой запрос
Код (Text): select s.id_sale, s.summa from `sale` as s left join `pay` as p on p.id_sale = s.id_sale where s.summa > p.summa group by s.id_sale хотя не правильно, но как то так, надо sum(b.summa) смотреть =)
@Artur_hopf, написать готовый запрос это слишком скучно. Но вот со стороны ТС реакции ноль, ну а мне оно особо и не надо.
Тема перемещена из PHP в MySQL --- Добавлено --- @Alex.G Для начала про сумму строк. Ты не сказал, но по имени колонок можно догадаться, что интересует группировка по id_sale Код (Text): SELECT id_sale, SUM(summa) AS summa FROM pay GROUP BY id_sale --- Добавлено --- Попробуй, посмотри что он из себя представляет. Затем можешь использовать как подзапрос в главном запросе "где pay меньше чем sale" Код (Text): SELECT sale.id_sale, sale.summa AS sale_summa, pay_grp.summa AS pay_summa FROM sale JOIN ( SELECT id_sale, SUM(summa) AS summa FROM pay GROUP BY id_sale ) AS pay_grp ON pay_grp.id_sale=sale.id_sale WHERE pay_grp.summa < sale.summa имена конечно караул! summa, id_sale. Ruglish какой-то
первый копипаст? может быть и так, а я предлагал вам самому написать запрос с моими подсказками, но вам оно не надо
@Alex.G, вот другой вариант для copy+paste: Код (Text): select t1.id_sale, sum(t1.summa) as summa_sale, sum(ifnull(t2.summa,0)) as summa_pay from sale as t1 left join pay as t2 on t2.id_sale = t1.id_sale group by t1.id_sale having sum(t1.summa) > sum(ifnull(t2.summa,0));
@Sail Результат - 1|20000|4000 Должно быть - 1|10000|4000 И алиасы не лучше ли по первым буквам чем t1, t2 ....? Код (Text): create table sale(id_sale int primary key, summa int); insert into sale values(1, 10000); insert into sale values(2, 13000); insert into sale values(3, 11000); create table pay(id_pay int primary key, id_sale int, summa int); insert into pay values(1, 1, 2000); insert into pay values(2, 1, 2000); insert into pay values(3, 2, 13000); insert into pay values(4, 3, 11000);
Да, действительно. Для этого и нужен подзапрос в join Лучше, конечно! Издание второе (исправленное и дополненное): Код (Text): select st1.id_sale, st1.summa as summa_sale, coalesce(pt2.summa_pay, 0) as summa_pay from sale as st1 left join (select id_sale, sum(summa) as summa_pay from pay group by id_sale) as pt2 on pt2.id_sale = st1.id_sale where st1.summa > coalesce(pt2.summa_pay, 0);
@keren, впрочем, раз уж в таблице продаж пара (id_sale, summa) уникальна, то достаточно добавить группировку по сумме и убрать аггрегатную функцию... Код (Text): select t1.id_sale, t1.summa as summa_sale, sum(ifnull(t2.summa,0)) as summa_pay from sale as t1 left join pay as t2 on t2.id_sale = t1.id_sale group by t1.id_sale, t1.summa having t1.summa > sum(ifnull(t2.summa,0));
@Sail группировка по summa там ни чего не изменит если она уже есть по id_sale, да и вообще - может же цена товара изменяться или другой товар по той-же цене .... Эта фраза как-то противоречит сама себе - сумма это агрегатная функция
И не нужно было. В данном случае. Фраза ведь приведена для описания изменений предыдущего варианта... Но не стоит забывать о том, что не входящие в группировку (group by) поля не следует включать в результат выборки вне аггрегатной функции.