Partage
  • Partager sur Facebook
  • Partager sur Twitter

3 requetes différentes sur la même table

    21 mars 2011 à 10:08:32

    Bonjour,

    J'ai une table actus avec 4 champs, id, Date, texte, permanent (le champ permanent prend la valeur 1 ou 0 pour indiquer si l'actu doit toujours être affichée ou non).

    Jusqu'à présent je fais 3 requetes sur cette table actus
    requete 1 pour connaître le nombre total d'actus "non permanentes" dans la table
    SELECT COUNT(*) FROM actus WHERE permanent != 1

    requete 2 pour récupérer les données des actus "permanentes"
    SELECT * FROM actus WHERE permanent = 1 ORDER BY id DESC

    requete 3 pour récupérer les données des 10 dernières actus "non permanentes"
    SELECT * FROM actus WHERE permanent != 1 ORDER BY id DESC LIMIT 0,10

    J'imagine que ce code n'est pas optimisé (3 requetes sur la même table). Est-il possible (souhaitable) de "compacter" ces 3 requetes en une seule.
    Au final bien sûr j'aimerais récupérer et afficher les données concernant les actus "permanentes" puis les 10 dernières actus. (Le nombre total d'actus non permanentes m'est utile pour paginer les liens vers les pages d'actus plus anciennes)
    Merci pour les pistes.
    • Partager sur Facebook
    • Partager sur Twitter
      21 mars 2011 à 12:29:49

      Bonjour
      Si tu code en php , tu pourrai "combiner" la requête 1 et 3 :
      SELECT * FROM actus WHERE permanent != 1 ORDER BY id DESC
      

      Pour connaitre le nombre de ligne tu utilises mysql_num_rows (ou fetchAll de pdo)
      Et pour limiter à 10, il suffit d'ajouter une variable compteur et d'arrêter d'afficher lorsque celle ci vaut 10 ou si tu n'as plus de résultat)
      • Partager sur Facebook
      • Partager sur Twitter
        21 mars 2011 à 12:48:59

        Le comptage ne sert à rien, donc on l' "optimise" XDDDD

        Quand aux deux autres,

        SELECT * FROM (SELECT * FROM actu WHERE permanent=1 ORDER BY id DESC) a
        UNION ALL
        (SELECT * FROM actu WHERE permanent=0 ORDER BY id DESC LIMIT 11) b
        


        Un index sur (permanent, id) permet d'optimiser les 2 requêtes.

        "=0" utilise l'index, pour "!=1" il faudrait vérifier.

        Le LIMIT 11 te permet de savoir si il y en a plus de 10 avec une seule requête (suffit de jeter la dernière ligne). Si il y en a plus de 10 tu affiches un lien "Plus..." et tu n'as donc pas besoin de compter.

        Citation

        Et pour limiter à 10, il suffit d'ajouter une variable compteur
        et d'arrêter d'afficher lorsque celle ci vaut 10 ou si tu n'as plus de résultat)



        Une excellente manière de crasher un serveur, en effet !...
        • Partager sur Facebook
        • Partager sur Twitter
          21 mars 2011 à 15:08:24

          Merci
          J'ai fait :

          (SELECT * FROM actus WHERE permanent=1 ORDER BY id DESC)
          UNION
          (SELECT * FROM actus WHERE permanent=0 ORDER BY id DESC LIMIT 0,10)

          Ce qui semble fonctionner (sauf que les actus permanentes ne sont pas classées par id DESC)

          Par contre j'aimerais quand même connaître le nombre total d'actus 'non permanentes' de la table. Mais avec ce type de requete avec UNION je crois que ce n'est pas possible.
          • Partager sur Facebook
          • Partager sur Twitter
            21 mars 2011 à 15:19:18

            > sauf que les actus permanentes ne sont pas classées par id DESC

            C'est normal car tu as demandé l'élimination des doublons en utilisant UNION et non UNION ALL. Le dédoublonnage change l'ordre...

            > Par contre j'aimerais quand même connaître le nombre
            > total d'actus 'non permanentes' de la table
            > Mais avec ce type de requete avec UNION
            > je crois que ce n'est pas possible.

            Effectivement, fais l'autre requête avec le count().
            • Partager sur Facebook
            • Partager sur Twitter
              21 mars 2011 à 15:51:26

              Merci
              J'ai changé UNION en UNION ALL mais pas de différence.
              Par contre si je spécifie un LIMIT dans la première partie de la requête, le tri se fait bien par id DESC (avec UNION ou UNION ALL d'ailleurs)
              • Partager sur Facebook
              • Partager sur Twitter

              3 requetes différentes sur la même table

              × 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