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.

Ce que je fais

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

Ce que je veux

Je cherche à avoir un retour pour chaque ID client avec 0 pour ceux qui n'ont pas de commande sur la période

Ce que j'obtiens

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.

3 réponses


Renand
Auteur

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

Renand
Auteur

Merci, j'avais aussi oublié un index sur une table.