Prenez les données suivantes:
db.users
id name
1 David
2 James
3 Mary
db.payments
amount user_id paid
5 1 0
55 1 1
94 1 1
5 2 0
55 2 1
94 2 1
5 2 0
55 2 1
94 2 1
Je voudrais GAUCHE JOIN le tableau des paiements à la table des utilisateurs et SOMMEZ () le montant où payé = 0:
SELECT users.*, SUM(payments.amount)
FROM users
LEFT JOIN payments
ON users.id = payments.user_id
WHERE payments.paid = 0
GROUP BY users.id
ORDER BY users.id DESC
Le problème se pose en ce que «mary» (utilisateur 3) n'est pas renvoyée car elle n'a aucun enregistrement dans la table des paiements. Cela revient à la clause WHERE vérifiant payé = 0.
Je voudrais qu'il renvoie 0 comme somme si aucun enregistrement.
Des idées pour faire ça?
3 réponses
Déplacez le prédicat payments.paid = 0
de la clause WHERE
vers ON
, comme:
SELECT users.*, SUM(payments.amount)
FROM users
LEFT JOIN payments
ON users.id = payments.user_id AND payments.paid = 0
GROUP BY users.id
ORDER BY users.id DESC
Si vous placez le prédicat dans la clause WHERE
, LEFT JOIN
devient un INNER JOIN
.
Vous devez mettre-> sum (isnull (payment.amount, 0)) comme nombre de paiements dans votre requête
SELECT users.*, SUM(isnull(payments.amount,0))
FROM users
LEFT JOIN payments
ON users.id = payments.user_id
WHERE payments.paid = 0
GROUP BY users.id
ORDER BY users.id DESC
Essaye ça:-
SELECT users.Id, users.name, SUM(case when paid=0 then amount else 0 end) as
req_amt
FROM users
LEFT JOIN payments
ON users.id = payments.user_id
GROUP BY users.id,users.name
ORDER BY users.id DESC
Merci:-)
De nouvelles questions
mysql
MySQL est un système de gestion de base de données relationnelle (RDBMS) gratuit et open source qui utilise SQL (Structured Query Language). N'UTILISEZ PAS cette balise pour d'autres bases de données telles que SQL Server, SQLite, etc. Ce sont des bases de données différentes qui utilisent toutes leurs propres dialectes SQL pour gérer les données.