Юрий
ЮрийDec. 26, 2017, 6:52 p.m.

Как вытащить данные из трех таблиц MySQL

Есть три таблицы

1. Клиенты
2. Выполненные работы
3. Касса

Структура первой таблицы id_user, name_user
Структура второй таблицы id_work, id_user, name_work, summ_work
Структура третей таблицы id_cash, id_user, summ_cash

Как правильно рассчитать задолженность клиентов, и вывести их список? Подскажите пожалуйста.


We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.

Do you like it? Share on social networks!

8
Evgenii Legotckoi
  • Dec. 26, 2017, 6:58 p.m.

То есть я правильно понимаю, что

  • summ_work - это стоимость работы
  • summ_cash - это общая сумма, которую вы хотите посчитать? Или это сумма средств пользователя? из которой вычитается суммарная стоимость работ?
    Юрий
    • Dec. 26, 2017, 7:04 p.m.

    summ_work - это сумма за выполненную работу, дол за клиентом

    summ_cash - это сумма внесенная в кассу
      Evgenii Legotckoi
      • Dec. 26, 2017, 7:13 p.m.
      • (edited)

      Чтобы вывести в таблицу такие данные, вам нужно будет использовать QSqlQueryModel .

      А запрос должен выглядеть следующим образом:
      SELECT id_user, SUM(summ_work)
      FROM table_works
      GROUP BY id_user
      Следующий запрос должен выбрать колонки id_user и summ_work из таблицы выполненных работ и при этом суммировать все значения долга работ по пользователям, как раз с учётом группировки по id_user.

      Единственное, здесь будет подставлен id пользователя, а не его имя. Для этого потребуется писать более сложный join запрос. Но реализуйте для начала этот вариант.
        Юрий
        • Dec. 26, 2017, 7:18 p.m.

        Пример: Работа для клиента стоила 800 р. но он заплатил 400 р.

        И получается, что нужно минусовать  из стоимости работ сумму которую он заплатил в кассу, и у кого разница не 0 то это должники.
          Evgenii Legotckoi
          • Dec. 26, 2017, 7:45 p.m.

          Примерно такой запрос получается.

          SELECT works.id_user, (SELECT cashes.summ_cash FROM cashes WHERE cashes.id_user == works.id_user) - SUM(works.summ_work)
          FROM works
          GROUP BY works.id_user
          При условии, что
          1. works - это название таблицы работ
          2. cashes - это название таблицы средств пользователей
            Юрий
            • Dec. 27, 2017, 12:57 a.m.

            Ошибка запроса "Подзапрос возвращает более одной записи"

              Юрий
              • Dec. 27, 2017, 1:03 a.m.
              SELECT users.id_user, (SELECT SUM(works.summ_work) FROM works WHERE cashes.id_user = users.id_user) - (SELECT SUM(cashes.summ_cash) FROM cashes WHERE cashes.id_user = users.id_user) FROM users ORDER BY id_user
              Данный запрос возвращает правильно  суммы, но тем клиентам у которых нет прихода в кассу, пишет NULL а нужно что бы писался долг.
                Evgenii Legotckoi
                • Dec. 27, 2017, 2:45 a.m.
                • The answer was marked as a solution.

                При создании пользователя создавайте запись с его балансом по принципу OneToOne связи.

                Это будет правильным подходом, поскольку одна запись баланса будет привязана к одному пользователю в любом случае. Входящие транзакции в кассу должны изменять баланс. Также можно автоматически изменять баланс и при добавлении работ.
                Иначе запросы к базе будут настолько страшными и огромными, что база с трудом будет справляться с простейшими операциями.
                Да и нужно быть Гуру SQL. Я к сожалению затрудняюсь написать обработку ситуации при отсутствии каких-либо записей в базе данных.

                  Comments

                  Only authorized users can post comments.
                  Please, Log in or Sign up
                  Ua

                  Qt - Test 001. Signals and slots

                  • Result:84points,
                  • Rating points4
                  Ua

                  Qt - Test 001. Signals and slots

                  • Result:42points,
                  • Rating points-8
                  ОК

                  Qt - Test 001. Signals and slots

                  • Result:47points,
                  • Rating points-6
                  Last comments
                  ИМ
                  Игорь МаксимовNov. 22, 2024, 9:51 p.m.
                  Django - Tutorial 017. Customize the login page to Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                  Evgenii Legotckoi
                  Evgenii LegotckoiOct. 31, 2024, 11:37 p.m.
                  Django - Lesson 064. How to write a Python Markdown extension Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                  A
                  ALO1ZEOct. 19, 2024, 5:19 p.m.
                  Fb3 file reader on Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                  ИМ
                  Игорь МаксимовOct. 5, 2024, 4:51 p.m.
                  Django - Lesson 064. How to write a Python Markdown extension Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                  d
                  dblas5July 5, 2024, 8:02 p.m.
                  QML - Lesson 016. SQLite database and the working with it in QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                  Now discuss on the forum
                  f
                  firstlunoxodFeb. 15, 2025, 1:46 p.m.
                  Рисование на QGraphicsScene при зажатой кнопке мыши Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
                  Дмитрий
                  ДмитрийFeb. 3, 2025, 4:24 p.m.
                  Создание deb-пакета. Как создать ярлык на рабочем столе после установки собственного deb-пакета? Всем привет. Сделал свой deb-пакет с программой. Всё устанавливается и работает. Ставлю по пути /usr/bin/my_application. Как для пользователя при установке пакета сразу создать ярлык на раб…
                  NW
                  Nayo WaiJan. 30, 2025, 7:22 p.m.
                  не запускается компьютер!!! Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
                  n
                  nklyJan. 3, 2025, 12:52 p.m.
                  Нужно запретить перемещение только некоторых итемов, остальные перемещать можно. Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
                  M
                  MarselAug. 17, 2023, 12:26 a.m.
                  OAuth2.0 через VK, получение email Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.

                  Follow us in social networks