IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

SELECT COUNT au lieu d'un while ? [PDO]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 18
    Par défaut SELECT COUNT au lieu d'un while ?
    Bonjour

    Je suis en train de coder un petit forum pour un ami en php.
    Il m'a demandé un petit compteur des topics sur lesquels il y a eu des réponses depuis la dernière visite d'un membre. Pour se faire, je me suis inspité d'un tuto trouvé sur le net qui montrait une façon de procéder. Après quelques tests, j'ai un code fonctionnel.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    <?php
    $query=$bdd->prepare('
    SELECT forum_topic.topic_last_post, Mb.membre_pseudo AS post_createur, tv_id, tv_post_id, tv_poste, Ma.membre_pseudo FROM forum_topic
    LEFT JOIN general_membres Mb ON Mb.membre_id = forum_topic.topic_createur
    LEFT JOIN forum_post ON forum_topic.topic_last_post = forum_post.post_id
    LEFT JOIN general_membres Ma ON Ma.membre_id = forum_post.post_createur
    LEFT JOIN forum_topic_view ON forum_topic.topic_id = forum_topic_view.tv_topic_id AND forum_topic_view.tv_id = :id
    ');
    $query->bindValue(':id',$_SESSION['id'],PDO::PARAM_INT);
    $query->execute();
     
    $nbrposts = 0;
     
    while ($data = $query->fetch()) {
      if ($data['tv_id'] == $_SESSION['id']) {
        if ($data['tv_poste'] == '0') {
          if ($data['tv_post_id'] != $data['topic_last_post']) {
            $nbrposts++;
          }
        }
        else {
          if ($data['tv_post_id'] != $data['topic_last_post']) {
            $nbrposts++;
          }
        }
      }
      else {
        $nbrposts++;
      }
    }
     
    $query->CloseCursor();
    echo $nbrposts;
    ?>
    Ma question est la suivante, le while n'est-il pas plus lourd qu'un SELECT COUNT ? Sachant que ce compteur sera rappelé via AJAX toutes les X secondes. Et dans le cas où ce serait préférable de n'utiliser qu'un SELECT COUNT, quelqu'un pourrait-il m'aiguiller, parce que je ne suis pas le meilleur en syntaxe SQL. Je me doute qu'il faut utiliser des WHERE mais à chaque tentative, j'échoue :/

    Merci bien

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Montre nous ta meilleure tentative, on te dira ce que tu as mal fait.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 18
    Par défaut
    Je n'ai plus mon bout de code (m'étant rabattu sur le if par dépit) mais ça devait donner quelque chose comme ça :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT COUNT(*) forum_topic.topic_last_post, Mb.membre_pseudo AS post_createur, tv_id, tv_post_id, tv_poste, Ma.membre_pseudo FROM forum_topic
    LEFT JOIN general_membres Mb ON Mb.membre_id = forum_topic.topic_createur
    LEFT JOIN forum_post ON forum_topic.topic_last_post = forum_post.post_id
    LEFT JOIN general_membres Ma ON Ma.membre_id = forum_post.post_createur
    LEFT JOIN forum_topic_view ON forum_topic.topic_id = forum_topic_view.tv_topic_id AND forum_topic_view.tv_id = :id
    WHERE tv_id <> :id 
    OR (tv_id = :id 
      AND (tv_poste = 0 
        AND (tv_post_id = topic_last_post)
      ) 
      OR tv_poste <> 0 
        AND (tv_post_id = topic_last_post)
    )

    Saignez pas trop des yeux, je suis débutant et absolument pas dans des études de ce type (je suis en médecine), j'apprends sur le fil par moi même donc soyez un peu indulgents ^^

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Je ne comprends ton cas $data['tv_id'] != $_SESSION['id'] puisque dans ta requête il y a une égalité entre les deux valeurs.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 18
    Par défaut
    Tu parles du dernier else je présume (dans mon while) ? celui qui ajoute 1 à $nbrposts lorsque la condition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($data['tv_id'] == $_SESSION['id'])
    n'est pas validée c'est ça ?
    J'ajoute des commentaires pour que tu comprennes le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    while ($data = $query->fetch()) {
      if ($data['tv_id'] == $_SESSION['id']) { // Si le membre $id a lu le topic...
        if ($data['tv_poste'] == '0') {  // Et que le membre n'a pas posté dans le topic...
          if ($data['tv_post_id'] != $data['topic_last_post']) {  // Mais qu'il y a un nouveau message posté par un autre
            $nbrposts++;  // Alors on ajoute 1 au compteur
          }
        }
        else {  // Et si le membre $id a posté dans le topic
          if ($data['tv_post_id'] != $data['topic_last_post']) {  // Et qu'il y a un nouveau message
            $nbrposts++;  // Alors, de même, on ajoute +1 au compteur
          }
        }
      }
      else {  //Enfin, s'il n'a même pas daigné lire le topic
        $nbrposts++;  // Aors, rebelotte, on ajoute +1 au conteur.
      }
    }
    Dans le SQL, ca reste flou, mais j'ai essayé de refaire le même schéma.

  6. #6
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Déjà tu as deuxs scénarios identiques : que le membre ait posté ou non, tu fais la même chose.
    Tu peux donc réduire d'une condition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while ($data = $query->fetch()) {
      if ($data['tv_id'] == $_SESSION['id'] && $data['tv_post_id'] != $data['topic_last_post'] ) { // Si le membre $id a lu le topic et qu'il y a un nouveau message posté par un autre
            $nbrposts++;
      }
      else {
        $nbrposts++; 
      }
    j'ai bon ?

    Attention pour le passage à la requête préparée : tu ne peux pas utiliser plusieurs fois ":id" il faut donner un nom différent à chaque fois.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Java][debutant]select count(*) ne retourne rien !!
    Par Invité dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 24/01/2007, 11h39
  2. [Oracle] select count(..) et Oracle 10G
    Par onclebob dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 28/09/2005, 15h04
  3. mon select count(*) marche pas
    Par zorba49 dans le forum Langage SQL
    Réponses: 14
    Dernier message: 05/08/2005, 08h28
  4. [Performance] RecordCount ou select Count(champ) ?
    Par shwin dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 28/09/2004, 17h37
  5. résultat de " select count "
    Par marie253 dans le forum Bases de données
    Réponses: 3
    Dernier message: 17/06/2004, 12h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo