Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SQL] Requête parrainage

Sujet résolu
    6 décembre 2010 à 15:04:51

    Bonjour !

    Je possède un site avec un moyen d'inscription. Lors de l'inscription, on peut renseigner un joueur comme "parrain" pour que ce dernier ait des avantages.

    Voici les 4 champs de la table membres utiles à la requête que je souhaite établir :

    id pseudo ts_inscription parrain
    1 gugusse 1279736012
    2 coucou 1279746072 gugusse
    3 hibou 1282124199 coucou
    4 bouh 1282404112 gugusse


    Le champ pseudo contient le pseudo du joueur, le champ ts_inscription contient le timestamp de l'inscription du joueur et le champ parrain contient le pseudo du parrain.

    J'aimerais réaliser une requête qui classe les meilleurs parrains (ayant > de 0 filleuls) durant un mois.
    En d'autres mots, j'aimerais compter le nombre de filleuls que chaque personne a eu entre les timestamp 1279746000 et 1282435200 et les classer par nombre de filleuls décroissant, avec le nombre de filleuls plus grand ou égal à 1.

    Par exemple, dans la table-exemple que je vous ai indiquée ci-dessus, la requête retournerait :
    gugusse : 2 filleuls
    coucou : 1 filleul

    Mais je n'y arrive vraiment pas... En français ça va, mais pas en SQL. Comment feriez-vous ? :euh:

    Merci d'avance ! :)
    • Partager sur Facebook
    • Partager sur Twitter
      6 décembre 2010 à 15:09:32

      SELECT COUNT(*) AS nb_filleuls FROM membre GROUP BY parrain ORDER BY nb_filleuls
      
      • Partager sur Facebook
      • Partager sur Twitter
        6 décembre 2010 à 17:40:39

        Merci, ça me retourne bien la liste des meilleurs parrains ! :)

        Cependant j'aimerais ajouter le critère du timestamp. C'est-à-dire qu'on ne compte que les filleuls inscrit entre les timestamp 1279746000 et 1282435200. On ne compte pas ceux d'avant ou d'après. C'est là que je coince sérieusement, en fait. :(

        Ma requête actuelle :
        SELECT parrain, COUNT(*) AS nb_filleuls FROM membres GROUP BY parrain ORDER BY nb_filleuls DESC
        


        Mais je ne parviens pas à compter les filleuls inscrits entre deux timestamp. :(
        • Partager sur Facebook
        • Partager sur Twitter
          6 décembre 2010 à 18:02:19

          Il suffit de rajouter un WHERE col BETWEEN 0 AND 2, par exemple.

          Note que stocker un timestamp unix dans une base de données relationnelle est une erreur, tu devrais stocker un timestamp au format DATETIME (ou TIMESTAMP).

          De plus, il est souvent plus pratique d'utiliser des foreign keys numériques plutôt que textuelles, les index sont souvent moins lourds et, de mémoire, c'est plus rapide.
          • Partager sur Facebook
          • Partager sur Twitter
            6 décembre 2010 à 18:24:56

            Je pensais que le WHERE agirait sur l'inscription du parrain et pas du filleul, c'est pour ça que j'ai demandé... Mais ça a l'air de fonctionner sur les filleuls en fait. :euh:

            Citation

            Note que stocker un timestamp unix dans une base de données relationnelle est une erreur, tu devrais stocker un timestamp au format DATETIME (ou TIMESTAMP).

            Je n'ai jamais cherché à comprendre comment ça fonctionnait, c'est pour ça que je les stocke comme cela. En quoi est-ce une erreur au juste ? C'est conventionnellement ?

            Citation

            De plus, il est souvent plus pratique d'utiliser des foreign keys numériques plutôt que textuelles, les index sont souvent moins lourds et, de mémoire, c'est plus rapide.


            Là par contre, je n'ai rien compris, on va voir si google m'aide ! :lol:

            Merci en tout cas !
            • Partager sur Facebook
            • Partager sur Twitter
              6 décembre 2010 à 18:32:05

              C'est surtout pas pratique du tout de stocker un timestamp unix. D'une part, ce n'est pas exploitable sous tous les environnements. Y'a PHP qui fonctionne avec des timestamps unix, mais si on prend Python ou Ruby par exemple, c'est avec des objets DateTime. Après, il y a une foule d'autres avantages, tu peux faire une recherche sur le SDZ ou sur Google, tu trouveras ton bonheur.

              Concernant les foreign keys, je disais simplement que plutôt que de stocker le nom du parrain, stocke son id. Pour plusieurs raisons, c'est plus pratique de travailler avec des valeurs numériques que textuelles.
              • Partager sur Facebook
              • Partager sur Twitter
                6 décembre 2010 à 18:39:56

                D'accord, merci, j'y penserai et je vais effectuer la modification, c'est encore possible tant que le site n'est pas lancé. :)

                Pour ceux qui seraient tombés sur ce topic grâce à une recherche, voici la requête finale :
                SELECT parrain, COUNT(*) AS nb_filleuls
                FROM pourfp_membres
                WHERE ts_inscription BETWEEN 1279746000 AND 1282435200
                GROUP BY parrain
                ORDER BY nb_filleuls DESC
                
                • Partager sur Facebook
                • Partager sur Twitter

                [SQL] Requête parrainage

                × 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