J'ai un petit problème avec une requête, je vous la présente :
SELECT DATE_FORMAT(FROM_UNIXTIME(o.order_created), '%Y-%m') as yyyymm, COUNT(DISTINCT o.order_user_id) as num_users
FROM users u
LEFT JOIN order o ON o.order_user_id = u.usr_id
GROUP BY yyyymm;
Sur cette requête je souhaite conter le nombre de user qui ont fait une commande dans le mois (cela fonctionne).
Mais mon problème est que je souhaite récupéré le user 1 fois en tout, (par exemple: je récupère le premier achat du user dans un mois précis et puis cette user ne sera pas compte dans d'autre mois). Mais actuellement, si mon user effectué des achats dans un autre mois, il sera compte dans l'autre mois aussi, et c'est pas ce que je souhaite.
J'ai réussi a retiré un doublon via le " COUNT(DISTINCT o.order_user_id)" comme cela il sera pas compter plusieurs fois dans un mois.
Désoler, je sais pas si j'ai bien explique mon problème.
Je ne suis pas sûr de comprendre, mais peut-être avec un IF ... IS NULL :
SELECT
DATE_FORMAT(FROM_UNIXTIME(o.order_created), '%Y-%m') as yyyymm,
IF( o.order_user_id IS NULL, 0, COUNT( DISTINCT o.order_user_id ) as num_users
FROM
users u
LEFT JOIN order o
ON o.order_user_id = u.usr_id
GROUP BY yyyymm;
Sinon, peux-tu expliquer un peu plus avec des données d'exemple ?
ce que j'ai du mal à comprendre dans ta requête c'est que tu fais un select d'éléments qui ne sont pas dans la table du FROM mais dans celle du JOIN.
En gros, pourquoi tu fais ta requête sur la table users avec un jointure sur order alors que tu ne récupères que des champs de la table order et donc un simple select sur la table order suffirait.
Sinon avec ta requête c'est normal que l'utilisateur soit compter dans chacun des mois, si tu veux le nombre d'acheteurs par mois. Si il a acheté le mois 1 et 3, c'est normal qu'il soit compter dans le mois 1 et 3, non ?
Si tu veux un mois en particulier, il faut le préciser dans une clause WHERE (dans l'exemple ci-dessous, c'est pour le mois de novembre 2020)
SELECT DATE_FORMAT(FROM_UNIXTIME(o.order_created), '%Y-%m') as yyyymm, COUNT(DISTINCT o.order_user_id) as num_users
FROM order o
WHERE yyyymm='2020-11'
GROUP BY yyyymm;
SELECT
DATE_FORMAT(FROM_UNIXTIME(o.order_created), '%Y-%m') as yyyymm,
IF( o.order_user_id IS NULL, 0, COUNT( DISTINCT o.order_user_id ) as num_users
Merci pour la réponse, mais je sais pas si le IF ... NULL fonctionne (je connaissais pas donc j'ai du mal l'utilise).
@umfred
Désoler en gros j'ai voulu mettre une partie de ma requête donc j'ai pas ajouté le reste c'est pourquoi il y'a une jointure sur le Order, en gros je souhaite comptabilité mes données par rapport a certains User (Je fais un where pour les filtrer). Donc si je devais faire de ta façon j'aurais été obligé de faire une Jointure sur User.
En gros je souhaite faire un tableau qui affichera le nombre de user qui ont fait leurs première commande dans chaque mois.
Exemple, j'ai 2 User, un qui a 10 commandes la premiere a été effectuer le "2020-01", un 2em qui a 5 commandes et qui a aussi été effectue le "2020-01" ,donc j'aurais ("2020-01" = 2 users). mais avec ma façon de faire j'ai pour les 2 users (""2020-01" = 2, "2020-02" = 2, "2020-03" = 2 ....) ! mais moi je souhaite un truc du genre (""2020-01" = 2, "2020-02" = 0, "2020-03" = 0 ....)! les 2 autres mois sont a 0 parce que les 2 utilisateurs ont déja ét comptabilité dans le premier mois et c'est ce que je souhaite avoir
1 utilisateur passe une commande le 01/01 donc il est compter puis une commande le 01/02 ou il n'est pas compté :
Je pense que le plus facile c'est d'ajouter simplement une colonne Date_1ere_commande dans user ?
Sinon, je ne voit pas trop comment faire...
il faudrait vérifier pour le mois 2 si chaque id_user n'a pas passé de commande les mois précédents.
Ou alors des la première commande rendre la date des commandes suivantes à null pour l'id_user
EDIT : Peut-être en utilisant la fonction LIMIT à 1 pour chaque id user (je sais pas si c'est faisable) , J'avais une fois réalisé un Top 3 par date de cette façon grâce à des variables incrémentées. Peut-être faire un Top 1 par utilisateur ou tu retiens la première date
Mais ça me parait un peut complexe et j'ai pas trop le temps en ce moment pour essayer d'écrire la requête.
- Edité par DeveloSt 10 novembre 2020 à 14:02:31
Site Internet : https://devst.go.yj.fr
Supprimer des utilisateurs en doublon
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Site Internet : https://devst.go.yj.fr