Partage
  • Partager sur Facebook
  • Partager sur Twitter

[MySQL] Select le nombre d'occurence

Sujet résolu
    17 juillet 2019 à 9:55:17

    Salut,

    Je cherche à faire des statistiques sur la fonctionnalité de recherche de mon site, celle-ci possède des critères afin de filtrer les recherches (par exemple on peut choisir de rechercher uniquement en français, en anglais ou alors on ne le précise pas et on sera susceptible de trouver des résultats dans les deux langues). Chaque recherche est enregistrée dans une table de ma base de donnée.

    J'aimerai donc crée des tableaux avec le nombre de recherches en fonction des différents critères sur une période donnée. J'utilise pour l'instant des requêtes de ce style :

    SELECT COUNT(SA_language) FROM search WHERE SA_date >= $dateDebut AND SA_date <= $dateFin GROUP BY SA_language

    Et je récupère le résultat dans un tableau que je peux ensuite exploiter comme je le veux. Cependant, il arrive que dans certaines périodes je n'ai aucune recherche en anglais par exemple et du coup cela fausse mes tableaux car au lieu de récupérer un tableau du style [[non précisé, 10000], [français, 8000], [anglais, 2000]] je récupère juste [[non précisé, 5000], [français, 2000]].

    J'aimerai donc modifier ma requête afin de récupérer tous les résultats possibles et donc avoir un tableau qui ressemblerait à ça [[non précisé, 5000], [français, 2000], [anglais, 0]].

    Voilà, j'espère que j'ai réussi à me faire comprendre. Merci d'avance pour vos propositions et bonne journée !

    -
    Edité par AdrienDeses 17 juillet 2019 à 9:56:29

    • Partager sur Facebook
    • Partager sur Twitter
      17 juillet 2019 à 12:28:02

      Salut ! 

      Tu peux donner la forme de ta base de données ?

      • Partager sur Facebook
      • Partager sur Twitter

      L'erreur dans un code se situe très souvent entre le clavier et la chaise. =D

        17 juillet 2019 à 13:47:02

        Yes !

        La structure de ma table est la suivante :

        search

        Sa_id : int

        Sa_date : int

        Sa_language : int (0: non précisé/1: français/0: anglais)

        Sa_categorie : int (0 : non précisé... puis un chiffre par catégorie comme pour language)

        Voilà, merci pour ta réponse

        • Partager sur Facebook
        • Partager sur Twitter
          17 juillet 2019 à 14:18:27

          Bon, apprécie ce code xD

          SELECT 
          	CASE 
          		WHEN max(SEARCH.Sa_language) = 0 THEN 'ALL' 
          		WHEN max(SEARCH.Sa_language) = 1 THEN 'FRANCAIS' 
          		WHEN max(SEARCH.Sa_language) = 2 THEN 'ANGLAIS' 
          		ELSE 'AUTRE' end ,
          	COUNT(X_SEARCH.Sa_language)
          FROM search
          LEFT JOIN SEARCH X_SEARCH ON SEARCH.Sa_id = X_SEARCH.Sa_id AND X_SEARCH.Sa_date BETWEEN $dateDebut AND $dateFin 
          GROUP BY SEARCH.Sa_language

          Si tu veux rajouter un langage dans ta recherche tu as juste à ajouter une clause dans le case.

          Dis moi si c'est ok :)

          • Partager sur Facebook
          • Partager sur Twitter

          L'erreur dans un code se situe très souvent entre le clavier et la chaise. =D

            17 juillet 2019 à 15:26:25

            Et ça marche ! Exactement ce que je voulais merci !

            Par contre, c'est hyper long. La table fait plusieurs millions de lignes et la requête prends quelques dizaines de secondes à s’exécuter.

            Je ne m'y connais pas du tout en optimisation de requête/bdd, y aurait-il moyen de réduire ce délais ?

            Encore merci de ton aide !

            • Partager sur Facebook
            • Partager sur Twitter
              17 juillet 2019 à 16:48:20

              Yup, tu peux accélérer ta recherche en rajoutant des index :

              https://sql.sh/cours/index

              En gros ça va créer une table cachée avec les colonnes que tu veux, et ça va permettre de chercher dans moins de données pour ressortir plus vite les résultats de ta requête.

              Ici, tu peux mettre dans un index Sa_id et Sa_date ( Je tiens à préciser que je ne suis pas un pro en Sql, peux être qu'il faut rajouter Sa_language, mais je ne pense pas que ce soit le cas )

              Un index ordinaire avec plusieurs colonnes : https://sql.sh/cours/index/create

              Dis moi si tu as des problèmes :)

              • Partager sur Facebook
              • Partager sur Twitter

              L'erreur dans un code se situe très souvent entre le clavier et la chaise. =D

                18 juillet 2019 à 10:45:17

                Salut !

                Alors après vérifications, la table possédait déjà des index pour les colonnes Sa_id et Sa_date (un pour chaque). J'ai essayé d'en crée un nouveau contenant les deux colonnes ensemble mais cela ne générait pas de gain de temps. J'en ai finalement crée un pour Sa_language qui m'a fait gagné une dizaine de seconde mais cela reste encore très long...

                Si tu as d'autres idées, je suis preneur :)

                Encore merci !

                • Partager sur Facebook
                • Partager sur Twitter
                  18 juillet 2019 à 12:50:27

                  et du coup tu en as fait un avec les trois ?

                  Après tu peux créer une nouvelle table contenant en enregistrement les langues différentes utilisées :

                  Langues :

                  • Langue
                  • Code

                  et tes lignes serais comme :

                  Langue		|Code
                  -----------------------
                  -----------------------
                  Mixte		|0
                  -----------------------
                  Francais	|1
                  -----------------------
                  Anglais		|2
                  -----------------------

                  et après en Sql tu ferais :

                  SELECT
                  	Langue,
                  	COUNT(search.Sa_language)
                  FROM Langues 
                  LEFT JOIN SEARCH search ON SEARCH.Sa_language = Langues.Code  AND SEARCH.Sa_date BETWEEN $dateDebut AND $dateFin
                  GROUP BY Langue

                  Dis ce que tu en penses :)

                  -
                  Edité par DrGazi7 18 juillet 2019 à 12:58:00

                  • Partager sur Facebook
                  • Partager sur Twitter

                  L'erreur dans un code se situe très souvent entre le clavier et la chaise. =D

                    19 juillet 2019 à 9:39:28

                    Oui j'avais également essayé avec trois.

                    Je pense que crée une nouvelle table est bien la meilleure solution, je suis passé à un temps d’exécution très raisonnable !

                    Encore merci de ton aide ! Bonne journée

                    • Partager sur Facebook
                    • Partager sur Twitter

                    [MySQL] Select le nombre d'occurence

                    × 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