ВНУТРЕННЕЕ СОЕДИНЕНИЕ mysql

#mysql

#mysql

Вопрос:

Я использую следующий запрос для получения отчета из другой таблицы моей базы данных, проверьте следующее…

 SELECT s.id, s.name, c.name AS course_name,
s.open_bal AS open_balance, sum(i.amount) AS gross_fee,
sum(i.discount) AS discount, sum(i.amount) - sum(i.discount) AS net_payable,
SUM(r.reg_fee r.tut_fee r.other_fee) AS net_recieved,
(sum(i.amount) - sum(i.discount)) - SUM(r.reg_fee r.tut_fee r.other_fee) AS balance_due
FROM students s
INNER JOIN courses c on c.id = s.course_id
LEFT JOIN invoices i on i.student_id = s.id
LEFT JOIN recipts r on r.student_id = s.id;
  

Счета-фактуры

 | id | student_id | amount   | discount |  dnt        | 
 ---- ------------ ---------- ---------- ------------- 
| 2  | 22         | 35000    | 0        |  2011/01/01 |
 ---- ------------ ---------- ---------- ------------- 
  

Не удается получить правильное значение от gross_fee и net_payable.

Спасибо.

Комментарии:

1. не могли бы вы изменить мой код своим, пожалуйста?

2. попробуйте изменить INNER на LEFT join и поделиться результатом

3. @Teneff проверьте вопрос еще раз, пожалуйста.

Ответ №1:

Учитывая SUM s в select, я полагаю, что это GROUP BY s.id должно сработать. В любом случае, GROUP BY кажется, что отсутствует 🙂

 SELECT s.id, s.name, c.name AS course_name,
s.open_bal AS open_balance,
SUM(r.reg_fee r.tut_fee r.other_fee) AS net_recieved,
 (sum(i.amount) - sum(i.discount)) - SUM(r.reg_fee r.tut_fee r.other_fee) AS balance_due
FROM students s
INNER JOIN courses c on c.id = s.course_id
LEFT JOIN invoices i on i.student_id = s.id
LEFT JOIN recipts r on r.student_id = s.id
GROUP BY s.id;
  

Редактировать

Отдельный запрос, позволяющий получить gross_fee и net_payable для всех счетов-фактур

 SELECT sum(amount) AS gross_fee,
  sum(discount) AS discount,
  sum(amount) - sum(discount) AS net_payable,
FROM invoices;
  

Комментарии:

1. спасибо за ваши ответы и, верно, я пропустил GROUP By, не могли бы вы еще раз проверить код, чтобы увидеть, делаю ли я какую-либо ошибку, или я могу оптимизировать этот код.

2. @Frosty Z даже выдает мне неверное значение gross_fee и net_payable.

3.Для меня выглядит нормально. Однако довольно много сумм. Если у вас возникнут проблемы с perf GROUP BY , вот несколько интересных чтений: dev.mysql.com/tech-resources/articles /… dev.mysql.com/doc/refman/5.0/en/group-by-optimization.html

4. Что касается «неправильных значений», пожалуйста, отредактируйте свой вопрос и точно объясните, чего вы ожидаете от этих значений (например, gross_fee для каждого студента или для каждого курса?)

5. Мне нужна общая плата за студента, и я думаю, вы получили мой расчет из приведенного кода. проверьте мою таблицу счетов, о которой идет речь

Ответ №2:

Получили ли обе записи студентов значение для s.course_id?

У вас есть внутреннее объединение студентов с курсами…

Курсы ВНУТРЕННЕГО СОЕДИНЕНИЯ c на c.id = s.course_id

Если s.course_id равен нулю в одной из записей student, запрос вернет только одну строку.