Bonjour,
Je cherche à récupérer le total des commandes de certains comptes client via une requête sur MySQL 5.6.38.
Si je supprime le GROUP BY, j'ai le total tout clients confondus, en l'ajoutant j'ai bien le montant par client ayant passé des commandes. Je cherche à retourner 0 pour ceux qui n'ont pas passé de commande sur la période.
Merci pour vos retours.
Voici la requête
SELECT SUM(a.price)
FROM answers a
INNER JOIN demands d
ON a.id = d.answerid
AND d.deletedat IS NULL
WHERE d.createdat BETWEEN '2021-01-01 00:00:00.0' AND '2021-01-26 23:59:59.0'
AND a.deletedat IS NULL
AND a.customerid IN ( 1, 2, 4, 5, 8, 18, 19, 21, 26, 33, 35, 43, 54, 68, 82, 87, 97, 103, 105, 112, 113, 126, 134, 142, 143, 144, 148, 151, 155, 200, 205, 232, 264, 265, 389, 390, 393, 432, 522, 534, 535, 536, 537, 538, 539, 545, 568, 589, 606, 613, 614, 645, 650, 664, 668, 670, 729, 730, 797, 807, 868, 980, 988, 1010, 1102, 1112, 1122, 1145, 1193, 1198, 1294 )
GROUP BY a.customerid
Je cherche à avoir un retour pour chaque ID client avec 0 pour ceux qui n'ont pas de commande sur la période
J'ai en retour de données sur pour les clients qui ont des commandes, mais aucune ligne pour ceux qui n'en n'ont pas.
Je me répond pour laisser une trace, j'ai trouvé un peu d'aide, il faut en passer par un LEFT JOIN sur la table avec laquelle je veux faire le GROUP BY
Comme cela :
SELECT c.id, IFNULL(SUM(a.price),0)
FROM customers c
LEFT JOIN answers a
INNER JOIN demands d
ON d.answerid = a.id
AND d.deletedat IS NULL
AND d.createdat BETWEEN '2021-01-01 00:00:00.0' AND '2021-01-26 23:59:59.0'
ON a.customerid = c.id
AND a.deletedat IS NULL
WHERE c.id IN ( 1, 2, 4, 5, 8, 18, 19, 21, 26, 33, 35, 43, 54, 68, 82, 87, 97, 103, 105, 112, 113, 126, 134, 142, 143, 144, 148, 151, 155, 200, 205, 232, 264, 265, 389, 390, 393, 432, 522, 534, 535, 536, 537, 538, 539, 545, 568, 589, 606, 613, 614, 645, 650, 664, 668, 670, 729, 730, 797, 807, 868, 980, 988, 1010, 1102, 1112, 1122, 1145, 1193, 1198, 1294)
GROUP BY c.id
Reste maintenant à trouver le moyen de rendre cela plus performant.
Peut être regarde du côté des sous-requetes
SELECT x
FROM y
WHERE id IN (SELECT ...)
Pareil tu as le WHERE EXISTS qui peut aider
SELECT nom_colonne1
FROM `table1`
WHERE EXISTS (
SELECT nom_colonne2
FROM `table2`
WHERE nom_colonne3 = 10
)
Cela peut parfois être plus simple