Partage
  • Partager sur Facebook
  • Partager sur Twitter

SQL selection multiple sur une table

plusieurs condition WHERE pour chaque select

Sujet résolu
    2 décembre 2019 à 10:25:52

    Bonjour,

    Je cherche à optimiser une requête SQL que je pensai relativement simple ;

    J'ai une table "individuels" qui me permet de compter le nombre de visiteurs de ma boutique (par exemple). Chaque visiteurs peut être "du coin" ou pas et venir pour la première fois ("primo") ou pas. A chaque nouvel enregistrement, une valeur DATE est attribuée à l'id d'enregistrement : "create.date".

    Je cherche à obtenir un tableau m'indiquant le nombre de visites total, le nombre de primo-visites total, le nombre de visites du coin, et le nombre de primo-visites du coin comprise dans une période de temps.

    J'y arrive bien en combinant chacune de mes requêtes en une seule mais je trouve que je me répète beaucoup dans ce code :

    SELECT SUM(individuels.nb) AS "Total des Visiteurs", 
    (SELECT SUM(individuels.nb) FROM individuels WHERE individuels.primo IS NOT NULL AND individuels.create_date BETWEEN "2019-11-02" AND NOW()) AS "PrimoVisiteurs",
    (SELECT SUM(individuels.nb) FROM individuels WHERE individuels.issold IS NOT NULL AND individuels.create_date BETWEEN "2019-11-02" AND NOW()) AS "Issoldunois",
    (SELECT SUM(individuels.nb) FROM individuels WHERE individuels.issold IS NOT NULL AND individuels.primo IS NOT NULL AND individuels.create_date BETWEEN "2019-11-02" AND NOW()) AS "Primo-Issoldunois"
    FROM individuels
    WHERE individuels.create_date BETWEEN "2019-11-02" AND NOW()

    Les SUM portent toutes sur la même table, et sur la même période... mais prennent une condition différente. Peut-on "mutualiser" ces paramètres ?

    Peut-on optimiser cette requête ? Est-ce la bonne façon de la rédiger ? Dois-je modifier la structure de ma table (avec d'autres tables intermédiaires...) ?

    Merci

    -
    Edité par Gooss 2 décembre 2019 à 10:37:16

    • Partager sur Facebook
    • Partager sur Twitter
      2 décembre 2019 à 10:54:26

      On peut faire comme ça :

      SELECT
      	SUM(nb) AS `Total des Visiteurs`,
      	SUM(IF(primo IS NULL, 0, nb)) AS PrimoVisiteurs,
      	SUM(IF(issold IS NULL, 0, nb)) AS Issoldunois,
      	SUM(IF(primo IS NULL OR issold IS NULL, 0, nb)) AS `Primo-Issoldunois`
      FROM individuels
      WHERE create_date BETWEEN '2019-11-02' AND NOW()

      Ou si tes colonnes primo et issold se comportent comme des booléens, tu peux avoir une présentation un peu différente avec un code plus simple :

      SELECT
      	primo,
      	issold,
      	SUM(nb)
      FROM individuels AS Total
      WHERE create_date BETWEEN '2019-11-02' AND NOW()
      GROUP BY primo, issold
      • Partager sur Facebook
      • Partager sur Twitter
        2 décembre 2019 à 11:06:16

        Oh !!! T'es magique ! Merci !

        J'aurais bien voulu que mes primo et issold soient des booléens (c'était prévu comme ça) mais j'ai rencontré des difficultés avec les inputs checkbox du formulaire php qui va avec... du coups, c'est du texte si c'est Thrue et du NULL si c'est False (ou l'inverse....) !

        Merci !

        Je vais prendre le temps de déchiffrer ta requête pour bien la comprendre avant de passer en résolu !

        • Partager sur Facebook
        • Partager sur Twitter
          2 décembre 2019 à 11:20:10

          De rien ! :magicien:

          La deuxième requête fait des sous-totaux en fonction des valeurs de primo et issold.

          Si le texte est toujours le même (quand le champ n'est pas null), alors les deux requêtes ont des résultats équivalents. Seule la présentation change.
          Sinon, la deuxième requête te fait des sous-totaux plus détaillés. Ce n'est pas forcément ce que tu veux.

          NB : pour des questions de ce genre, utilise plutôt le forum Bases de données.

          • Partager sur Facebook
          • Partager sur Twitter
            2 décembre 2019 à 11:42:49

            Zachee54 à dit : pour des questions de ce genre, utilise plutôt le forum Bases de données.

            J'ai cherché longtemps (mais en cherchant un forum SQL...) un forum pour poser ma question mais sans rien trouvé d'intelligent.... au mieux celui-ci. Je posterai au bon endroit la prochaine fois !

            Merci encore, c'est PAR-FAIT ! Et j'utilise déjà la technique sur d'autres requêtes au fonctionnement similaire, Merci !

            • Partager sur Facebook
            • Partager sur Twitter

            SQL selection multiple sur une table

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            • Editeur
            • Markdown