Récupérer le résultat d'un COUNT() SQL

Bonjour,

J'ai un petit soucis, je bosse sur un forum et je dois réussir à sélectionner le post qui a le plus de réponse.
La table est constituée de 3 champs : id_post, Numero_reponse, Text_reponse.

Je voudrais donc afficher uniquement LE ou LES posts (si plusieurs post ont le même nombre de réponses) qui ont le plus de réponses.

J'arrive bien à compter le nombre de réponses pour chaque post avec cette requête :


SELECT COUNT(id_post) FROM REPONSE GROUP BY Numero_reponse



Toutefois je n'arrive pas à transcrire "Utilise le précédent résultat et sélectionne le ou les plus grand chiffres précédemment comptés".

J'ai bien essayé avec la commande MAX() mais sans grand succès.

Pourriez-vous m'aider à me débloquer je vous prie ?

Sachant que je dois faire ça en une seule requête SQL donc pas de php ou autre langage...

Merci d'avance !

8 réponses

  1. Bonjour,

    Peut - être que cela pourra t'aider:

    select max(nb)
    from
    (
      select count(id_post)
      from reponse
      group by Numero_reponse
    ) 


    Bien à toi,
    MyTux.
    0
    1. Merci de ta réponse rapide.

      Toutefois j'ai un message d'erreur à l'exécution que je n'ai jamais eu auparavant :

      #1248 - Every derived table must have its own alias

      Pourrais-tu m'éclairer ?

      Merci.

      Cordialement,

      Revan
      0
      1. Re bonjour,

        Oui en effet, le système te demande de lui fournir un alias donc reprend la query ainsi:
        select max(nb)
        from
        (
          select count(id_post)
          from reponse as nb
          group by Numero_reponse
        ) as reponse;
        


        Avec explication de la doc mysql:
        http://dev.mysql.com/doc/refman/5.0/en/from-clause-subqueries.html

        Bien à toi,
        MyTux.
        0
        1. Bonjour,

          Merci bien, pour cette réponse mais malheureusement, j'ai toujours une erreur, me disant qu'il ne connait pas le champs nb, et c'est l'erreur que j'avais au début, qui fait que je ne sais pas comment récupérer le résultat du COUNT...

          Pourrais-je solliciter une nouvelle fois de l'aide ?

          Merci.

          Cordialement,
          Revan
          0
          1. Bonjour,

            L'erreur vient de ma part. En fait la query est:
            select max(nb)
            from
            (
              select count(id_post) as nb
              from reponse
              group by Numero_reponse
            ) as reponse;
            


            Bien à toi,
            MyTux.
            0
        2. Merci beaucoup cela fonctionne, enfin presque :)

          En effet, j'ai deux posts qui ont deux réponses chacun, toutefois la requête ne me renvoie qu'un post sur les deux...

          Tu vas me haïr, désolé :)

          Cordialement,
          Revan

          EDIT : Rectification : En ajoutant une réponse dans le post numéro 3, donc le post numéro 3 contient 3 réponse et le post 1 2 réponses, la requête me renvoie toujours comme résultat le post 1
          0
          1. Bonjour,

            Pour reprendre, tu veux afficher les messages qui ont le plus de postes c'est ça? Si c'est le cas, il faut imposer une limite dans ta requête. Car comment il va savoir, ceux qu'il faut afficher?

            Bien à toi,
            MyTux.
            0
        3. Pour reprendre, je veux afficher l'ID des posts contenant le plus de messages.

          Dans le cas où le post 2 contient 2 messages et le post 3 2 message, le résultat de la requête doit renvoyer 2 ET 3.

          Dans le cas où le post 2 contient 8 messages et les autres moins, le résultat de la requête doit être 2.

          Cordialement,
          Revan

          EDIT : J'ai fait une erreur, j'avais inversé les champs comme un boul**, la requête fonctionne bien pour récupérer UN post, toutefois il y a toujours le soucis de récupération du cas où il y a plus d'un post avec un nombre égal de messages.
          0
          1. Essai ca

            select id_post from reponse
            group by id_post
            having count(*) = (
            select max(nb)
            from
            (
              select count(id_post) as nb
              from reponse
              group by Numero_reponse
            ) as reponse
            )
            0
            1. Ou ca

              SELECT id_post
              FROM reponse
              GROUP  BY id_post
              HAVING COUNT(*) >= ALL (
                   SELECT COUNT(*)
                   FROM   reponse
                   GROUP  BY id_post
              )
              
              0