За последние 24 часа нас посетил 22401 программист и 997 роботов. Сейчас ищут 645 программистов ...

Запрос из одной таблицы с сравнением суммы строк из другой таблицы

Тема в разделе "MySQL", создана пользователем Alex.G, 28 фев 2019.

  1. Alex.G

    Alex.G Активный пользователь

    С нами с:
    22 мар 2017
    Сообщения:
    44
    Симпатии:
    1
    Добрый день!
    Есть две таблицы 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
    Подскажите как сделать такой запрос
     
  2. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @Alex.G, знаешь как посчитать сумму в pay?
     
  3. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    Код (Text):
    1.  
    2. select s.id_sale, s.summa
    3. from `sale` as s
    4. left join `pay` as p on p.id_sale = s.id_sale
    5. where s.summa > p.summa
    6. group by s.id_sale
    хотя не правильно, но как то так, надо sum(b.summa) смотреть =)
     
    #3 Artur_hopf, 28 фев 2019
    Последнее редактирование: 28 фев 2019
  4. Alex.G

    Alex.G Активный пользователь

    С нами с:
    22 мар 2017
    Сообщения:
    44
    Симпатии:
    1
    Спасибо, попробую
     
  5. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    @Alex.G подожди, кто нибудь по опытней ответит, тот запрос не правильный =)
     
  6. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @Artur_hopf, написать готовый запрос это слишком скучно. Но вот со стороны ТС реакции ноль, ну а мне оно особо и не надо.
     
  7. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    Тема перемещена из PHP в MySQL
    --- Добавлено ---
    @Alex.G Для начала про сумму строк. Ты не сказал, но по имени колонок можно догадаться, что интересует группировка по id_sale
    Код (Text):
    1. SELECT id_sale, SUM(summa) AS summa
    2. FROM pay
    3. GROUP BY id_sale
    --- Добавлено ---
    Попробуй, посмотри что он из себя представляет. Затем можешь использовать как подзапрос в главном запросе "где pay меньше чем sale"
    Код (Text):
    1. SELECT sale.id_sale, sale.summa AS sale_summa, pay_grp.summa AS pay_summa
    2. FROM sale
    3. JOIN (
    4.     SELECT id_sale, SUM(summa) AS summa
    5.     FROM pay
    6.     GROUP BY id_sale
    7. ) AS pay_grp ON pay_grp.id_sale=sale.id_sale
    8. WHERE pay_grp.summa < sale.summa
    имена конечно караул! summa, id_sale. Ruglish какой-то :)
     
  8. Alex.G

    Alex.G Активный пользователь

    С нами с:
    22 мар 2017
    Сообщения:
    44
    Симпатии:
    1
    Спасибо огромное! Все сработало!
    --- Добавлено ---
    Вот и наступил мой первый опыт с JOIN
     
  9. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    первый копипаст? может быть и так, а я предлагал вам самому написать запрос с моими подсказками, но вам оно не надо
     
  10. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    Для спасибо есть кнопка с большим пальцем вверх.
     
  11. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    @Alex.G, вот другой вариант для copy+paste:
    Код (Text):
    1. select t1.id_sale, sum(t1.summa) as summa_sale, sum(ifnull(t2.summa,0)) as summa_pay
    2. from sale as t1 left join pay as t2 on t2.id_sale = t1.id_sale
    3. group by t1.id_sale having sum(t1.summa) > sum(ifnull(t2.summa,0));
     
  12. keren

    keren Новичок

    С нами с:
    15 ноя 2017
    Сообщения:
    513
    Симпатии:
    42
    @Sail Результат - 1|20000|4000
    Должно быть - 1|10000|4000
    И алиасы не лучше ли по первым буквам чем t1, t2 ....?
    Код (Text):
    1. create table sale(id_sale int primary key, summa int);
    2. insert into sale values(1, 10000);
    3. insert into sale values(2, 13000);
    4. insert into sale values(3, 11000);
    5. create table pay(id_pay int primary key, id_sale int, summa int);
    6. insert into pay values(1, 1, 2000);
    7. insert into pay values(2, 1, 2000);
    8. insert into pay values(3, 2, 13000);
    9. insert into pay values(4, 3, 11000);
     
  13. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    Да, действительно. Для этого и нужен подзапрос в join :)
    Лучше, конечно!
    Издание второе (исправленное и дополненное):
    Код (Text):
    1. select st1.id_sale, st1.summa as summa_sale, coalesce(pt2.summa_pay, 0) as summa_pay
    2. from sale as st1 left join
    3. (select id_sale, sum(summa) as summa_pay from pay group by id_sale) as pt2 on pt2.id_sale = st1.id_sale
    4. where st1.summa > coalesce(pt2.summa_pay, 0);
    :)
     
    #13 Sail, 1 мар 2019
    Последнее редактирование: 1 мар 2019
  14. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    @keren, впрочем, раз уж в таблице продаж пара (id_sale, summa) уникальна, то достаточно добавить группировку по сумме и убрать аггрегатную функцию...
    Код (Text):
    1. select t1.id_sale, t1.summa as summa_sale, sum(ifnull(t2.summa,0)) as summa_pay
    2. from sale as t1 left join pay as t2 on t2.id_sale = t1.id_sale
    3. group by t1.id_sale, t1.summa having t1.summa > sum(ifnull(t2.summa,0));
     
  15. keren

    keren Новичок

    С нами с:
    15 ноя 2017
    Сообщения:
    513
    Симпатии:
    42
    @Sail группировка по summa там ни чего не изменит если она уже есть по id_sale, да и вообще - может же цена товара изменяться или другой товар по той-же цене ....
    Эта фраза как-то противоречит сама себе - сумма это агрегатная функция o_O
     
  16. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    * по полю `summa` таблицы sale :)
     
  17. keren

    keren Новичок

    С нами с:
    15 ноя 2017
    Сообщения:
    513
    Симпатии:
    42
    @Sail так я не знаю зачем нужно было что-то суммировать, агрегировать в таблице sale :)
     
  18. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    И не нужно было. В данном случае. Фраза ведь приведена для описания изменений предыдущего варианта... :)
    Но не стоит забывать о том, что не входящие в группировку (group by) поля не следует включать в результат выборки вне аггрегатной функции.