Partage
  • Partager sur Facebook
  • Partager sur Twitter

Réduire les requetes mysql

    25 février 2006 à 18:38:11

    Salut tout le monde :)
    J'aimerais savoir s'il y a un moyen plus simple de réduire les requetes mysql que ce que j'ai fait dans le code suivant :


    //On compte le nombre de message dans le sujet
    $nbreMessages_requete = mysql_query("SELECT COUNT (*) AS nbre FROM forums_messages WHERE idsujet='$idsujet'");
    $nbreMessages = mysql_fetch_array($nbreMessages_requete);

    //On trouve l'id du premier message
    $premierMessage_requete = mysql_query("SELECT id FROM forums_messages WHERE idsujet='$idsujet' ORDER BY id LIMIT 0,1");
    $premierMessage = mysql_fetch_array($premierMessage_requete);

    //On trouve l'id du dernier message
    $dernierMessage_requete = mysql_query("SELECT id FROM forums_messages WHERE idsujet='$idsujet' ORDER BY id DESC LIMIT 0,1");
    $dernierMessage = mysql_fetch_array($dernierMessage_requete);


    Ce code me sert compter les messages d'un sujet dans un forum et à trouver le premier et le dernier message de ce sujet. ;)

    Le problème est que ce code est lui même dans une boucle pour afficher les sujets et que ces requetes mysql vont se repeter pour chaque sujet.
    S'il y a 2 sujets c'est pas grave mais au fur et à mesure du temps plein de sujets seront postés et ça prendra un temps fou pour charger la page.

    J'ai trouve une solution pour réduire ces 3 requetes mysql en une seul mais je l'impression qu'on pourrait faire encore plus simple ^^

    Voila ma solution :


    $messages_requete = mysql_query("SELECT id, auteur, timestamp FROM forums_messages WHERE idsujet='$sujets['id']'");
    $nbreMessages = mysql_num_rows($messages_requete);

    $nMessage = 0;
    while($messages = mysql_fetch_array($messages_requete))
    {
    $nMessage++;
    if($nMessage == 1)
    $premierMessage = $messages['id'];
    elseif($nMessage == $nbreMessages)
    $dernierMessage = $messages['id'];
    }


    Je sais pas vous mais moi je trouve que ce code est très "lourd". Faire une boucle pour scanner tous les messages pour trouver le dernier et le premier, si il y a 10, 20 messages ça va, mais sinon je crois bien que PHP ne suivra plus :lol: .

    Voila, c'est pour quoi je demande votre aide, si vous connaissez une autre facon de trouver le premier champ et le dernier champ en plus simple dans une boucle de traitage des resultats de la requete mysql.
    En tout cas, si vous avez lu jusque la, merci à vous :) car mon post est quand même un peu long ! :-°
    Merci d'avance :)
    • Partager sur Facebook
    • Partager sur Twitter
      25 février 2006 à 19:32:08

      Pour la première, je dirais:
      SELECT COUNT(M.id) AS nb, MIN(M.id) AS min, MAX(M.id) AS max FROM forums_messages M WHERE idsujet = '.$idsujet.' GROUP BY idsujet


      Je crois qu'on pourrait simplifier encore avec la requête précédent le while afin de n'avoir qu'une seule requête pour toute la boucle, mais pour ça, il faudrait que je vois le while ainsi que la requête...
      • Partager sur Facebook
      • Partager sur Twitter
        25 février 2006 à 19:59:54

        Pourrait tu m'expliquer ton code ? :-° Je n'y comprend pas grand chose :lol:
        Sinon ma requete precedente :


        $sujets_requete = mysql_query('SELECT id, titre, auteur, vus FROM forums_sujets WHERE idforum=\''.$_GET['idforum'].'\' ORDER BY id_dernier_message DESC LIMIT '.$premier_sujet.', '.$nombre_sujets_page.'')or die(mysql_error());
        while($sujets = mysql_fetch_array($sujets_requete))
        {

        $messages_requete = mysql_query("SELECT id, auteur, timestamp FROM forums_messages WHERE idsujet='$sujets['id']'");
        $nbreMessages = mysql_num_rows($messages_requete);

        $nMessage = 0;
        while($messages = mysql_fetch_array($messages_requete))
        {
        $nMessage++;
        if($nMessage == 1)
        $premierMessage = $messages['id'];
        elseif($nMessage == $nbreMessages)
        $dernierMessage = $messages['id'];
        }

        }


        Sinon merci de m'avoir répondu. Je commençais à deseperer :lol:
        • Partager sur Facebook
        • Partager sur Twitter
          25 février 2006 à 20:20:40

          Ma requête:
          SELECT COUNT(M.id) AS nb, MIN(M.id) AS min, MAX(M.id) AS max FROM forums_messages M WHERE M.idsujet = '.$idsujet.' GROUP BY M.idsujet
          Elle compte le nombre d'id et prend l'id min et le max de ta table forums_messages pour les quels idsujet = $idsujet en regroupant toutes les entrées par idsujet... :)
          Comme tu regroupes par idsujet et que tu cherches pour un idsujet précis, normalement, il n'y a qu'une entrée à la sortie... ;)

          maintenant, si on ne veut en faire qu'une avec la première, je dirais peut-être:
          $sujets_requete = mysql_query('SELECT S.id, S.titre, S.auteur, S.vus, COUNT(M.id) AS nb, MIN(M.id) AS min, MAX(M.id) AS max FROM forums_sujets S, forums_messages M WHERE S.idforum=\''.$_GET['idforum'].'\' AND M.idsujet = '.$idsujet.' ORDER BY S.id_dernier_message DESC GROUP BY M.idsujet LIMIT '.$premier_sujet.', '.$nombre_sujets_page.'')or die(mysql_error());


          Seulement, comme je n'ai pas tes tables pour faire des tests, je n'ai pas moyen de voir où j'ai fait une erreur, car à mon avis, il y en a une là... :/ j'ai un doute sur le GROUP BY...
          • Partager sur Facebook
          • Partager sur Twitter

          Réduire les requetes mysql

          × 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