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 :

Requete avec jointures


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 152
    Par défaut Requete avec jointures
    Bonjour,

    Je suis en train d'apprendre comment faire des requêtes avec jointures.

    J'ai lu le tuto, mais j'ai une erreur dans ma requête et je ne vois pas d'où elle vient...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <?php
    $requete = mysql_query('SELECT A.NomSite, A.Categorie FROM GestionMenus A, FicheSitesJeux B, NoteGlobaleVotes C WHERE A.NomSite = B.NomSiteJeux AND A.Section = "JeuxEnLigne" AND B.Taille = "Long" AND B.NomSiteJeux NOT IN (SELECT id_du_vote FROM NoteGlobaleVotes ORDER BY note DESC LIMIT 10) GROUP BY B.NomSiteJeux');
     
    while($donnees = mysql_fetch_array($requete))
     
    {
    array_push($tab1,array('NomSiteJeux' => $donnees['NomSite'], 'Categorie' => $donnees['Categorie']));
    //Test: on verifie les donnees inserees dans le tableau
    echo'<p>'.$donnees['NomSite'].'<p>';
    }
    ?>
    En fait j'ai 3 tables: GestionMenus, FicheSitesJeux et NoteGlobaleVotes.

    Le probleme dans ma requete doit concerner NoteGlobaleVotes avec la clause NOT IN...cela m'indique un Warning: mysql_fetch_array() : supplied argument is not a valid Mysql result..

    Donc je souhaite qu'il récupère les nom des sites de jeux présent dans la table GestionMenus et FicheSitesJeux, mais qui ne sont pas présent dans la requête de $sql

    Merci

  2. #2
    Membre Expert
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 564
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mysql_query(...) or die(mysql_error());
    Pour connaitre l'erreur MySQL retournée.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 152
    Par défaut
    Bonjour,

    La requête:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $requete = mysql_query('SELECT A.NomSite, A.Categorie FROM GestionMenus A, FicheSitesJeux B, NoteGlobaleVotes C WHERE A.NomSite = B.NomSiteJeux AND A.Section = "JeuxEnLigne" AND B.Taille = "Long" AND B.NomSiteJeux NOT IN (SELECT id_du_vote FROM NoteGlobaleVotes ORDER BY note DESC LIMIT 10) GROUP BY B.NomSiteJeux') or die('Erreur SQL !'.$sql.'<br>'.mysql_error());
    Renvoie:

    Alors l'erreur retournée est : Erreur SQL !Resource id #6
    This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

    Et cela renvoie :

    Erreur SQL !Resource id #6
    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 'C.note ORDER BY C.note DESC LIMIT 10' at line 1
    Pour:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $requete = mysql_query('SELECT A.NomSite, A.Categorie, C.note FROM GestionMenus A, FicheSitesJeux B, NoteGlobaleVotes C WHERE A.NomSite = B.NomSiteJeux AND A.Section = "JeuxEnLigne" AND B.Taille = "Long" AND B.NomSiteJeux NOT IN (SELECT id_du_vote FROM NoteGlobaleVotes) GROUP BY A.NomSite, A.Categorie C.note ORDER BY C.note DESC LIMIT 10') or die('Erreur SQL !'.$sql.'<br>'.mysql_error());
    Merci

  4. #4
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    l'erreur est parfaitement claire :
    This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
    Tu ne peux pas utiliser LIMIT dans une sous-requête utilisée dans un IN
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT A.NomSite, A.Categorie 
    FROM GestionMenus A, FicheSitesJeux B, NoteGlobaleVotes C 
    WHERE A.NomSite = B.NomSiteJeux 
    AND A.Section = "JeuxEnLigne" 
    AND B.Taille = "Long" 
    AND B.NomSiteJeux NOT IN 
    	(SELECT id_du_vote FROM NoteGlobaleVotes ORDER BY note DESC LIMIT 10)
    GROUP BY B.NomSiteJeux
    Donc la question est : as-tu réellement besoin de cette limite ? si oui, tu vas devoir faire une requête indépendante pour récupérer les valeurs à placer dans le IN...
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 152
    Par défaut
    J'ai 2 tables: NoteGlobaleVotes qui contient la note attribué par les membres, au site de jeu, puis une autre table nommé FicheSitesJeux ou sont listé les sites de jeux, et enfin la table GestionMenus qui contient les sites à affichés dans les menus.

    J'ai un menu top 10, dans lequel sont listé les 10 sites de jeux ayant les meilleures notes. J'ai inséré le résultat de ma requête dans un premier tableau nommé $tab.

    Ensuite dans une seconde requete, je selectionne tous les nom de sites de jeux 'sans distinction), mais ils doivent etre present dans la table GestionMenus et j'insere le resultat de la requete dans un autre tableau, $tab1.

    J'affiche le menu top 10 normalement...Puis je souhaite que les autres menus, ne contiennent pas un des elements du top 10.

    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
    <?php
    $tab=array();
    $tab1=array();
     
    //On crée un premier tableau
    $sql=mysql_query('SELECT id_du_vote FROM NoteGlobaleVotes ORDER BY note DESC LIMIT 10');
     
    while($res = mysql_fetch_array($sql))
    {
    array_push($tab,array('NomSiteJeux' => $res['id_du_vote']));
    } 
     
    $requete = mysql_query('SELECT A.NomSite, A.Categorie FROM GestionMenus A, FicheSitesJeux B WHERE A.NomSite = B.NomSiteJeux AND A.Section = "JeuxEnLigne" AND B.Taille = "Long" GROUP BY B.NomSiteJeux');
     
    while($donnees = mysql_fetch_array($requete))
    {
    array_push($tab1,array('NomSiteJeux' => $donnees['NomSite'], 'Categorie' => $donnees['Categorie']));
    echo'<p>'.$donnees['NomSite'].'<p>';
    } 
     
    var_dump($tab);
    echo'<p>';
    var_dump($tab1);
     
    for($i = 0; $i < count($tab1); $i++) // Tant que l'on peut parcourir le tableau
    {                        
      if (in_array($tab1['NomSiteJeux'],$tab)) //On teste si l'élément est dans le 1er tableau
        {
              echo'<p>'.$tab1['NomSiteJeux'].'<p>';
        }                        
    }
    ?>
    Voila ce que retourne var_dump avec 7 elements noté, figurant dans le top10 et 2 elements present dans GestionMenus:

    $tab :
    array(7) { [0]=> array(1) { ["NomSiteJeux"]=> string(9) "Camenerve" } [1]=> array(1) { ["NomSiteJeux"]=> string(9) "Toilokdo2" } [2]=> array(1) { ["NomSiteJeux"]=> string(8) "Binbango" } [3]=> array(1) { ["NomSiteJeux"]=> string(9) "Fichetest" } [4]=> array(1) { ["NomSiteJeux"]=> string(10) "Testimania" } [5]=> array(1) { ["NomSiteJeux"]=> string(7) "Labrute" } [6]=> array(1) { ["NomSiteJeux"]=> string(6) "Marre2" } }

    $tab1 :
    array(2) { [0]=> array(2) { ["NomSiteJeux"]=> string(5) "Marre" ["Categorie"]=> string(10) "Multi-Jeux" } [1]=> array(2) { ["NomSiteJeux"]=> string(8) "Toilokdo" ["Categorie"]=> string(10) "Multi-Jeux" } }

    Ceci devrait donc afficher les noms de sites de jeux: Toilokdo et Marre car ils ne sont pas présent dans le premier tableau...Mais cela me retourne rien...

Discussions similaires

  1. Réponses: 5
    Dernier message: 06/02/2007, 13h46
  2. [ADO] Requete avec jointure
    Par okparanoid dans le forum Bases de données
    Réponses: 6
    Dernier message: 08/11/2006, 17h05
  3. recherche aide pour requete avec jointure
    Par nebil dans le forum Requêtes
    Réponses: 5
    Dernier message: 21/08/2006, 17h03
  4. [MySQL] Erreur dans une requête avec jointures
    Par bobic dans le forum Langage SQL
    Réponses: 17
    Dernier message: 03/08/2006, 13h04
  5. requete avec jointure & group by
    Par de LANFRANCHI dans le forum Langage SQL
    Réponses: 9
    Dernier message: 27/07/2004, 14h31

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