Partage
  • Partager sur Facebook
  • Partager sur Twitter

Union avec max(count)

SQL

Sujet résolu
    18 mars 2011 à 7:15:52

    Bonjour,

    Je vous plante le décor....

    J'ai 2 tables :
    1 table "membre" où j'enregistre pour chaque membre le numéro de la campagne suivie par le membre.
    1 table "campagne" où j'indique le numero de la campagne (différent de l'id) et combien de membres max sont autorisés dans la campagne..

    Pour trouver le nombre d'inscrits d'une campagne je fais simplement ceci :
    $sql = 'SELECT COUNT(*) FROM membres WHERE numcampagne = ' . $numerocampagne . '';
    


    Là où je bloque c'est que j'aimerais trouver la requête pour afficher le numéro de la campagne ayant le plus d'inscrits... mais qui ne soit pas encore complètes donc (< membremax)


    Voici la structure des tables

    Structure (partielle) de la table campagne
    Champ Type
    ID int(2)
    membremax int(5)
    numero int(2)



    Structure (partielle) de la table membres
    Champ Type
    id int(5)
    numcampagne tinyint(2)


    Et voilà où j'en suis... c'est ma première tentative de jointure alors soyez sympa :-)


    SELECT t.numero
    FROM
        campagne AS t
    JOIN
        membres AS p
    ON
        t.numero = p.numcampagne
    	
       GROUP BY t.numero
    having count(*)= select max(count(p.numcampagne) from membres
    


    Voilà où j'en suis et évidemment la dernière ligne ne plait pas du tout au sql.. :-(

    Si vous avez une piste je prends...

    Merci d'avoir pris de le temps de me lire
    A+
    • Partager sur Facebook
    • Partager sur Twitter
      18 mars 2011 à 7:52:12

      having count(*)= select max(numcampagne) from membres

      ??
      • Partager sur Facebook
      • Partager sur Twitter
        18 mars 2011 à 8:21:40

        Alors d'abord une remarque de méthode : si tu veux qu'on puisse t'aider facilement, il faut qu'on puisse tester facilement les suggestions qu'on te fait, sur un serveur SQL. Donc il faut que tu fournisses du code pour :
        - créer les tables (c'est bien de donner leur structure, mais la requête de création SQL directement exécutable ça nous donne moins de travail)
        - remplir les tables avec un peu d'information pour tester (deux ou trois lignes de chaque)

        Tu n'as pas donné ces informations, alors les gens vont te donner des requêtes qu'ils n'auront pas testé.

        SELECT
          campagne.numero,
          COUNT(membres.id) as nb_membres
        FROM
          membres
          JOIN campagne ON membres.numcampagne = campagne.numero
        GROUP BY campagne.numero
        WHERE COUNT(membres.id) < campagne.membremax
        ORDER BY COUNT(membres.id) DESC
        LIMIT 1
        
        • Partager sur Facebook
        • Partager sur Twitter
          18 mars 2011 à 14:19:52

          Bonjour,

          je rentre du travail.. et je dois bientôt y repartir....

          Voici le fichier pour créer les tables


          -- phpMyAdmin SQL Dump
          -- version 3.2.0.1
          -- http://www.phpmyadmin.net
          --
          -- Serveur: localhost
          -- Généré le : Ven 18 Mars 2011 à 13:01
          -- Version du serveur: 5.1.36
          -- Version de PHP: 5.3.0
          
          SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
          
          --
          -- Base de données: `xxxxxx`
          --
          
          -- --------------------------------------------------------
          
          --
          -- Structure de la table `campagne`
          --
          
          CREATE TABLE IF NOT EXISTS `campagne` (
            `ID` int(2) NOT NULL AUTO_INCREMENT,
            `membremax` int(5) NOT NULL,
            `description` varchar(150) NOT NULL,
            `tempspremium` varchar(6) NOT NULL,
            `type` varchar(10) NOT NULL,
            `numero` int(2) NOT NULL,
            `tempsfree` varchar(6) NOT NULL,
            PRIMARY KEY (`ID`)
          ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;
          
          -- --------------------------------------------------------
          
          --
          -- Structure de la table `membres`
          --
          
          CREATE TABLE IF NOT EXISTS `membres` (
            `id` int(5) NOT NULL AUTO_INCREMENT,
            `nom` varchar(21) NOT NULL,
            `pass` varchar(40) NOT NULL,
            `email` varchar(60) NOT NULL,
            `envoi_etat` int(1) NOT NULL DEFAULT '0',
            `dateenregistrement` int(15) NOT NULL,
            `IP` varchar(15) NOT NULL,
            `numcampagne` tinyint(2) NOT NULL
          
          
            PRIMARY KEY (`id`)
          ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=12156 ;
          



          Heu je ne savais pas comment rajouter quelques enregistrements avec....



          Cette requete =>
          SELECT
            campagne.numero,
            COUNT(membres.id) as nb_membres
          FROM
            membres
            JOIN campagne ON membres.numcampagne = campagne.numero
          GROUP BY campagne.numero
          WHERE COUNT(membres.id) < campagne.membremax
          ORDER BY COUNT(membres.id) DESC
          LIMIT 1
          

          Me renvoit une erreur :

          near 'WHERE COUNT(membres.id) < campagne.membremax ORDER BY COUNT(membres.id) DESC L' at line 8

          Pour corser le tout, j'aurais aimer rajouter un critère sur le type de la campagne qui est soit "Free" soit "Premium"

          Donc pour résumer au final :
          Je voudrais rechercher la campagne de type "Free" (par exemple) qui a le plus de membres mais qui n'est pas encore complète donc inférieure à membremax.

          J'espère avoir réussi à me faire comprendre.

          Merci pour vos réponses.



          • Partager sur Facebook
          • Partager sur Twitter
            18 mars 2011 à 14:52:55

            Je ne pense pas que ça soit la raison de ton erreur, mais il faut aussi grouper sur campagne.membremax :
            SELECT
              campagne.numero,
              COUNT(membres.id) as nb_membres
            FROM
              membres
              JOIN campagne ON membres.numcampagne = campagne.numero
            GROUP BY campagne.numero, campagne.membremax
            WHERE COUNT(membres.id) < campagne.membremax
            ORDER BY COUNT(membres.id) DESC
            LIMIT 1
            
            • Partager sur Facebook
            • Partager sur Twitter
              19 mars 2011 à 5:51:32

              Bonjour,

              Merci pour votre aide mais j'ai toujours le même message d'erreur
              #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE COUNT(membres.id) < campagne.membremax ORDER BY COUNT(membres.id) DESC L' at line 8
              


              à cause de cette ligne

              WHERE COUNT(membres.id) < campagne.membremax
              


              Si j'enlève cette ligne la requête est exécutée.... si quelqu'un a une idée de ce qui bloque...

              Pour commencer avec les jointures je ne suis pas allé au plus simple...

              Merci pour votre soutien
              • Partager sur Facebook
              • Partager sur Twitter
                19 mars 2011 à 8:29:33

                Bien sûr:
                SELECT
                  campagne.numero,
                  COUNT(membres.id) as nb_membres
                FROM
                  membres
                  JOIN campagne ON membres.numcampagne = campagne.numero
                GROUP BY campagne.numero, campagne.membremax
                HAVING COUNT(membres.id) < campagne.membremax
                ORDER BY COUNT(membres.id) DESC
                LIMIT 1
                
                • Partager sur Facebook
                • Partager sur Twitter
                  19 mars 2011 à 15:39:03

                  Un grand merci pour cette requête qui fonctionne parfaitement!!!

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Union avec max(count)

                  × 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