2011-04-13 7 views
1

J'utilise la requête suivante pour obtenir le rapport de table différente de ma base de données, vérification suivante ...mysql INNER JOIN

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; 

factures

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

Ne pas obtenir la valeur correcte de gross_fee et net_payable.

merci.

+1

GROUP BY peut-être? –

+0

pouvez-vous modifier mon code avec le vôtre s'il vous plaît? – seoppc

+0

essayer de changer la jointure 'INNER' à' LEFT' et partager le résultat – Teneff

Répondre

2

Étant donné les SUM s dans la sélection, je suppose que GROUP BY s.id devrait faire l'affaire. Quoi qu'il en soit un GROUP BY semble manquer :)

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; 

EDIT

requête séparée permettant de récupérer gross_fee et net_payable pour toutes les factures

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

merci pour vos réponses et droit je manquais GROUP BY, pouvez-vous même vérifier le code une fois de plus pour voir si je fais une erreur ou je peux optimiser ce code. – seoppc

+0

@Frosty Z c'est même me donner la mauvaise valeur de gross_fee et net_payable. – seoppc

+0

Ça me va. Beaucoup de SOMMES cependant. Si vous rencontrez des problèmes de perf avec 'GROUP BY', voici quelques lectures intéressantes: http://dev.mysql.com/tech-resources/articles/debunking-group-by-myths.html http: //dev.mysql. com/doc/refman/5.0/fr/group-by-optimization.html –

0

Avoir les deux dossiers des étudiants a obtenu une valeur pour s.course_id?

Vous avez une jointure interne des étudiants aux cours ...

cours c INNER JOIN sur c.id = s.course_id

Si s.course_id est nul dans l'un des dossiers des étudiants , la requête ne retournera qu'une ligne.

+0

oui tous les deux ont une valeur, que dois-je changer dans le code? – seoppc