Partage
  • Partager sur Facebook
  • Partager sur Twitter

Probleme avec une requete SQL

elle ne marche pas

Sujet résolu
    21 juin 2006 à 16:45:42

    Salut je voudrais faire un système de MP donc il faut que j'utilise les sous-requêtes et jointures mais mais code ne marche pas. Voici mes erreurs:
    "Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /media/160go/hebergement/basher/epsilon/mp.php on line 103

    Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /media/160go/hebergement/basher/epsilon/mp.php on line 108"

    Et voici mon code:
    <?php

    $sql = query('SELECT @m := mp_id AS mp_id, mp_titre, mp_soustitre,
    ( SELECT id FROM mp_messages WHERE mp_id = @m ORDER BY msg_date ASC LIMIT 1 ) AS                                      createur_id, COUNT(*) AS nb_messages,
    ( SELECT id FROM mp_messages WHERE mp_id = @m ORDER BY msg_date DESC LIMIT 1 ) AS dernier_message_mbr_id,
    ( SELECT msg_date FROM mp_messages WHERE mp_id = @m ORDER BY msg_date DESC LIMIT 1 ) AS dernier_message_date FROM mp NATURAL JOIN
    mp_messages WHERE mp_id IN ( SELECT DISTINCT mp_id FROM mp_participants WHERE id ="'
    .$_SESSION['id_membre'].'" GROUP BY mp_id
    LIMIT 20 OFFSET 1;'
    );
    $selectMsg = mysql_fetch_array($sql);

    $requete = query('SELECT mp_id, id, pseudo FROM mp NATURAL JOIN mp_participants NATURAL JOIN membres WHERE mp_id IN
    ( SELECT mp_id FROM mp NATURAL JOIN mp_participants WHERE id ="'
    .$_SESSION['id_membre'].'" ');

    while($selectMbr = mysql_fetch_array($requete))
    {

    echo 'id du mp = '.$selectMbr['mp_id'].'<br/>';
    echo 'id du mbr = '.$selectMbr['id'].'<br/>';
    echo 'pseudo du mbr = '.$selectMbr['pseudo'].'<br/><br/>';

    echo 'id du mp = '.$selectMsg['mp_id'].'<br/>';
    echo 'titre du mp = '.$selectMsg['mp_titre'].'<br/>';
    echo 'sous titre du mp = '.$selectMsg['mp_soustitre'].'<br/>';
    echo 'id du membre créateur = '.$selectMsg['createur_id'].'<br/>';
    echo 'nb msg = '.$selectMsg['nb_messages'].'<br/>';
    echo 'dernier msg du membre = '.$selectMsg['dernier_message_mbr_id'].'<br/>';
    echo 'date du dernier msg = '.$selectMsg['dernier_message_date'].'<br/><br/>';

    echo '-----------------------------------------------------------------------------------------------<br/><br/>';

    }

    ?>


    Et si vous voulez voici les tables que j'ai crées:
    CREATE TABLE `membres` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `nom` text NOT NULL,
      `prenom` text NOT NULL,
      `email` text NOT NULL,
      `mot_passe` text NOT NULL,
      `timestamp_naissance` text NOT NULL,
      `timestamp_inscription` bigint(20) NOT NULL,
                  .............
     `code` int(11) NOT NULL,
      `souvenir` int(1) NOT NULL DEFAULT '0',
      PRIMARY KEY  (`id`),
      KEY `id` (`id`)
    ) ENGINE=MyISAM DEFAULT CHARACTER SET utf8 COLLATE utf8_bin AUTO_INCREMENT=65 ;




    CREATE TABLE `mp` (
      `mp_id` int(11) NOT NULL AUTO_INCREMENT,
      `mp_titre` varchar(255) DEFAULT NULL,
      `mp_soustitre` varchar(255) DEFAULT NULL,
      `mp_icone` varchar(255) DEFAULT NULL,
      `mp_type` text NOT NULL,
      `mp_date` bigint(20) DEFAULT NULL,
      PRIMARY KEY  (`mp_id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;





    CREATE TABLE `mp_messages` (
      `msg_id` int(11) NOT NULL AUTO_INCREMENT,
      `mp_id` int(11) NOT NULL,
      `id` int(11) NOT NULL,
      `msg_texte` text NOT NULL,
      `msg_date` bigint(20) DEFAULT NULL,
      PRIMARY KEY  (`msg_id`),
      KEY `mp_id` (`mp_id`),
      KEY `mbr_id` (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;




    CREATE TABLE `mp_participants` (
      `id` int(11) NOT NULL,
      `mp_id` int(11) NOT NULL,
      `prt_derniere_vue` bigint(20) DEFAULT NULL,
      PRIMARY KEY  (`id`,`mp_id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;


    Voilà est-ce que vous pouvez m'aider?

    Merci d'avance
    • Partager sur Facebook
    • Partager sur Twitter
      21 juin 2006 à 16:47:50

      Le mieux est encore de connaitre le type de l'erreur -> mysql_error() ;)
      • Partager sur Facebook
      • Partager sur Twitter
        21 juin 2006 à 21:11:32

        J'ai mis or die(mysql_error . $sql); et or die(mysql_error . $requete);
        Et j'ai ce message: Erreur de syntaxe près de '' à la ligne 6

        Quelqu'un peut m'aider?

        Merci d'avance
        • Partager sur Facebook
        • Partager sur Twitter
          21 juin 2006 à 21:12:31

          Oui c'est pas du tout ça qu'il faut mettre mais plutot
          ... or die(mysql_error());
          • Partager sur Facebook
          • Partager sur Twitter
            22 juin 2006 à 12:07:48

            Ca me met quand même la même erreur :(
            Quelqu'un peut m'aider?

            Merci d'avance
            • Partager sur Facebook
            • Partager sur Twitter
              22 juin 2006 à 15:14:50

              MansonMan :D

              le or die() de TheBasher permet de voir la requête parsée avec les variables en plus du reste, c'est trés pratique ;)

              Sinon la requête suivante devrait fonctionner ( j'ai pas mal optimisé au passage ):

              SELECT
                      @m := mp_id AS mp_id,
                      @prem := MIN(msg_id),
                      @dern := MAX(msg_id),
                      mp_titre,
                      MAX(msg_date) AS dernier_message_date
                      COUNT(*) AS nb_messages,
                      mp_soustitre,
                      (
                              SELECT id
                              FROM mp_messages
                              WHERE msg_id = @prem
                      ) AS createur_id,
                      (
                              SELECT id
                              FROM mp_messages
                              WHERE msg_id = @dern
                      ) AS dernier_message_mbr_id,
              FROM mp
                      NATURAL JOIN mp_messages
              WHERE mp_id IN (
                              SELECT DISTINCT mp_id
                              FROM mp_participants
                              WHERE id = '.$_SESSION['id_membre'].'
                      )
              GROUP BY mp_id
              LIMIT 20


              Enjoy :)
              • Partager sur Facebook
              • Partager sur Twitter
                22 juin 2006 à 20:35:12

                Merci mais comment on fait pour s'en servir après de cette requete (et de l'autre => la plus courte), je veux dire par là comment faire pour pouvoir afficher ce qu'on veut, car avec mysql_fetch_array j'ai toujours là même erreur.

                PS=>je sais que quand il y a des MAX ou MIN je dois faire un mysql_result

                Merci d'avance
                • Partager sur Facebook
                • Partager sur Twitter
                  22 juin 2006 à 21:07:48

                  Nonon pas de mysql_result ici, en fait mysql_result sert quand il n'y a qu'un seul résultat

                  Mais si tu as un MAX avec un GROUP BY tu devras utiliser mysql_fetch_assoc comme d'habitude ;):)

                  Ca te donne toujours la même erreur ? o_O

                  En fait ma requête est beaucoup plus courte que la première au début du topic ( qui venait de moi aussi si j'ai bonne mémoire ^^ )

                  En mode compact, la nouvelle donne:

                  SELECT @m := mp_id AS mp_id, @prem := MIN(msg_id), @dern := MAX(msg_id), mp_titre, MAX(msg_date) AS dernier_message_date,        COUNT(*) AS nb_messages, mp_soustitre,
                  ( SELECT id FROM mp_messages WHERE msg_id = @prem ) AS createur_id,
                  ( SELECT id FROM mp_messages WHERE msg_id = @dern ) AS dernier_message_mbr_id
                  FROM mp NATURAL JOIN mp_messages WHERE mp_id IN ( SELECT DISTINCT mp_id FROM mp_participants WHERE id = '.$_SESSION['id_membre'].' ) GROUP BY mp_id LIMIT 20


                  :)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    22 juin 2006 à 21:23:31

                    J'ai une nouvelle erreur: "Erreur de syntaxe près de 'COUNT(*) AS nb_messages, mp_soustitre, (SELECT id FROM mp_messag' à la ligne 2"

                    Et voici mon code:
                    $sql = query('SELECT @m := mp_id AS mp_id, @prem := MIN(msg_id), @dern := MAX(msg_id), mp_titre, MAX(msg_date) AS dernier_message_date
                            COUNT(*) AS nb_messages, mp_soustitre, (SELECT id FROM mp_messages WHERE msg_id = @prem) AS createur_id,
                                    (SELECT id FROM mp_messages WHERE msg_id = @dern) AS dernier_message_mbr_id, FROM mp NATURAL JOIN mp_messages WHERE mp_id IN (
                            SELECT DISTINCT mp_id FROM mp_participants WHERE id = '
                    .$_SESSION['id_membre'].') GROUP BY mp_id LIMIT 20') or die(mysql_error());

                    while ($selectMsg = mysql_fetch_assoc($sql))
                    {
                    echo 'id du mp = '.$selectMsg['mp_id'].'<br/>';
                    echo 'titre du mp = '.$selectMsg['mp_titre'].'<br/>';
                    echo 'sous titre du mp = '.$selectMsg['mp_soustitre'].'<br/>';
                    echo 'id du membre créateur = '.$selectMsg['createur_id'].'<br/>';
                    echo 'nb msg = '.$selectMsg['nb_messages'].'<br/>';
                    echo 'dernier msg du membre = '.$selectMsg['dernier_message_mbr_id'].'<br/>';
                    echo 'date du dernier msg = '.$selectMsg['dernier_message_date'].'<br/><br/>';

                    echo '-----------------------------------------------------------------------------------------------<br/><br/>';

                    }


                    Est-ce que quelqu'un peut m'aider?

                    Merci d'avance
                    • Partager sur Facebook
                    • Partager sur Twitter
                      23 juin 2006 à 10:43:44

                      Personne ne peut m'aider?
                      • Partager sur Facebook
                      • Partager sur Twitter
                        23 juin 2006 à 13:11:25

                        il manque une virgule avant COUNT ;)
                        • Partager sur Facebook
                        • Partager sur Twitter
                          23 juin 2006 à 17:43:59

                          Merci, il y avait aussi une autre erreur après mais c'était aussi une virgule (en trop cette fois ^^ )

                          Donc maintenant il n'y a plus d'erreur et tout s'affiche. TOUT? Non, l'id du membre créateur et l'id du membre qui a posté le dernier message n'affichent rien.

                          Remarque => la sous requête leur correspondant est celle où on utilise l'égalit avec les variables utilisateur (mp_id = @m => par exemple)

                          Merci d'avance de m'aider

                          PS=> à quoi sert le GROUP BY?

                          EDIT
                          J'ai trouvé où était l'erreur et ça marche, en fait il fallait que je remplace:
                          @prem := MIN(msg_id)

                          Par:
                          @prem := (SELECT MIN(msg_id) FROM mp_messages WHERE mp_id = @m)


                          Et pareil avec le dernier message.

                          Par contre ma question qui demandait ce que fait GROUP BY est toujours valable
                          • Partager sur Facebook
                          • Partager sur Twitter
                            23 juin 2006 à 20:15:34

                            je t'ai répondu par mp pour le group by ( en gros c'est pas facile à expliquer et je lui ai conseillé d'attendre la suite de mon tuto ou d'aller voir un site spécialisé pour ceux que ça intéresse ).

                            Pour ce qui est du MIN et du MAX foireux, ça m'étonne un peu ( beaucoup même ), mais l'essentiel c'est que ça fonctionne :s
                            • Partager sur Facebook
                            • Partager sur Twitter
                              23 juin 2006 à 20:19:36

                              Eh bien en fait il n'est pas vraiment foireux mais il fallait rajouter un WHERE pour ne pas prendre ce qu'il ne faut pas

                              Merci de ta préponse

                              Sujet résolu
                              • Partager sur Facebook
                              • Partager sur Twitter
                                23 juin 2006 à 21:54:39

                                normalement le group by devait y remédier en fait ^^

                                Enfin bon tant pis
                                • Partager sur Facebook
                                • Partager sur Twitter

                                Probleme avec une requete SQL

                                × 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