Partage
  • Partager sur Facebook
  • Partager sur Twitter

Supprimer des utilisateurs en doublon

    9 novembre 2020 à 16:21:28

    Bonjour, 

    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.

    • Partager sur Facebook
    • Partager sur Twitter
      9 novembre 2020 à 16:59:34

      Bonjour,

      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 ?

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        9 novembre 2020 à 17:22:42

        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;



        • Partager sur Facebook
        • Partager sur Twitter
          9 novembre 2020 à 18:44:26

          Benzouye a écrit:

          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

          -
          Edité par armbar 9 novembre 2020 à 18:53:49

          • Partager sur Facebook
          • Partager sur Twitter
            9 novembre 2020 à 18:56:52

            OK, en effet, il faudrait alors faire une jointure sur user. Tu peux mettre plusieurs conditions dans le WHERE
            • Partager sur Facebook
            • Partager sur Twitter
              10 novembre 2020 à 10:32:19

              Oui j'ai essayer de faire des conditions dans le where pour prendre que la premiere commande mais sans succès
              • Partager sur Facebook
              • Partager sur Twitter
                10 novembre 2020 à 13:30:04

                Bonjour, 

                Si je comprend bien : 

                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

                • Partager sur Facebook
                • Partager sur Twitter

                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.
                • Editeur
                • Markdown