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 :

Problème de requete [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2009
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 101
    Par défaut Problème de requete
    Bonjour,

    Je m'explique, j'ai 2 tables (une équipes et une joueurs)

    -Dans équipes il y a le nom le pays... mais surtout 11 champs comportant les ID des titulaires (Poste_1 comporte l'ID du gardien, Poste_2 comporte l'ID du defenseur gauche...)
    -Chaque joueurs est donc représenté dans sa table par son ID, son nom...

    Je souhaite donc récuperer l'ID et le nom des joueurs correspondant à l'ID compris dans les champs Poste_X

    J'ai réussi à afficher l'ID et le nom du joueur compris dans le champ Poste_1 grace à la requete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT ID, Nom FROM joueurs WHERE ID=(select Poste_1 FROM equipes WHERE Nom='Marseille')
    -J'ai donc récuperer l'ID et le nom du joueur

    Je me suis donc dit pour récuperer tous les joueurs je vais faire cette requete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT ID, Nom FROM joueurs WHERE ID=(select Poste_1, Poste_2, Poste_3, Poste_4, Poste_5, Poste_6, Poste_7, Poste_8, Poste_9, Poste_10, Poste_11 FROM equipes WHERE Nom='Marseille')
    Mais la requete SQL me retourne :#1241 - Operand should contain 1 column(s)


    Avez-vous la solution?
    Merci d'avance

  2. #2
    Membre chevronné Avatar de guigo
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 612
    Par défaut
    Salut,
    moi je ferais avec inner join

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    for($i=1, $i<=11; $i++){
    $Sql="SELECT Id, Nom FROM joueur INNER JOIN equipe ON (equipe.poste_".$i"=joueur.Id) WHERE equipe.Nom='Marseille'";
     
    ...
    }
    Voila, tu peux optimiser en creant un champs txt qui concatene les WHERE de la requte, puis execute la requete + txt_concat en sortie de boucle.

    @+ Guigo

  3. #3
    Membre chevronné
    Avatar de djayp
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    295
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 295
    Par défaut
    Salut !

    Plutôt que d'avoir une table avec "Poste_1, Poste_2, .., Poste_11", je t'inviterais dans un premier temps à restructurer ta base pour que les données soient stockées de façon plus cohérentes.

    Tu as en fait besoin de 4 tables :
    - equipe (id, nom)
    - joueur (id, nom, prenom)
    - poste (id, nom) // exemple : attaquant, guardien, défenseur...
    - joueur_equipe (id_equipe, id_joueur, id_poste)

    Tu pourras ensuite facilement récupérer la liste de tes joueurs de la façon suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT j.nom, j.prenom 
    FROM joueur AS j
    INNER JOIN joueur_equipe AS je ON j.id=je.id_joueur
    INNER JOIN equipe AS e ON e.id=je.id_equipe
    WHERE e.nom= 'Marseille'
    Avec un peu d'imagination, tu pourras également spécifier le numéro des joueurs, s'ils sont titulaires ou remplaçant, etc...

    A++

  4. #4
    Membre confirmé
    Inscrit en
    Janvier 2009
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 101
    Par défaut
    Citation Envoyé par guigo Voir le message
    Salut,
    moi je ferais avec inner join

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    for($i=1, $i<=11; $i++){
    $Sql="SELECT Id, Nom FROM joueur INNER JOIN equipe ON (equipe.poste_".$i"=joueur.Id) WHERE equipe.Nom='Marseille'";
     
    ...
    }
    Voila, tu peux optimiser en creant un champs txt qui concatene les WHERE de la requte, puis execute la requete + txt_concat en sortie de boucle.

    @+ Guigo
    Voilà j'ai essayer ça mais rien ne s'affiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // D'abord, on se connecte à MySQL
    				mysql_connect("localhost", "root", "");
    				mysql_select_db("football_simulation");
     
    		for ($i=1; $i<=11; $i++){
    			$test=mysql_query("SELECT ID, Nom FROM joueurs INNER JOIN equipes ON (equipes.poste_'.$i'=joueurs.ID) WHERE equipes.Nom='Marseille'");
    			echo $test['ID'];
     
     
    		}
    Merci

  5. #5
    Membre confirmé
    Inscrit en
    Janvier 2009
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 101
    Par défaut
    Citation Envoyé par djayp Voir le message
    Salut !

    Plutôt que d'avoir une table avec "Poste_1, Poste_2, .., Poste_11", je t'inviterais dans un premier temps à restructurer ta base pour que les données soient stockées de façon plus cohérentes.

    Tu as en fait besoin de 4 tables :
    - equipe (id, nom)
    - joueur (id, nom, prenom)
    - poste (id, nom) // exemple : attaquant, guardien, défenseur...
    - joueur_equipe (id_equipe, id_joueur, id_poste)

    Tu pourras ensuite facilement récupérer la liste de tes joueurs de la façon suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT j.nom, j.prenom 
    FROM joueur AS j
    INNER JOIN joueur_equipe AS je ON j.id=je.id_joueur
    INNER JOIN equipe AS e ON e.id=je.id_equipe
    WHERE e.nom= 'Marseille'
    Avec un peu d'imagination, tu pourras également spécifier le numéro des joueurs, s'ils sont titulaires ou remplaçant, etc...

    A++
    je vais tester ta solution, je te tient au courant

  6. #6
    Membre confirmé
    Inscrit en
    Janvier 2009
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 101
    Par défaut
    merci beaucoup djayp ça fonctionne à merveille

  7. #7
    Membre confirmé
    Inscrit en
    Janvier 2009
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 101
    Par défaut
    Re bonjour,

    Bon j'ai un peu de mal pour le moment avec les requetes SQL complexe donc je me permet de poser un nouveau problème que je n'arrive pas à résoudre depuis 9h00.

    Voilà la base est organisé comme pour le post précédent de djayp

    Ce que je veux en fait c'est que je veut la liste des joueurs de Marseille qui ne sont pas titulaire c'est à dire que l'ID du joueur est differente de l'ID du joueur de la base "joueur_equipe"

    J'ai donc essayer pas mal de requete allant meme au sous requetes mais rien à faire je n'y arrive pas.

    Voilà un exemple de requete que j'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT j.nom, j.id FROM joueurs AS j	
    INNER JOIN joueur_equipe AS je ON j.id<>je.id_joueur 	
    WHERE j.club = 'Marseille'
    En fait cette requete me retourne tous les joueurs de Marseille mais 10 fois et il affiche meme les titulaires.

    Voilà donc si quelqu'un a des propositions à faire je suis preneur.

    merci d'avance

  8. #8
    Membre chevronné
    Avatar de djayp
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    295
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 295
    Par défaut
    Re-salut !

    Content de voir que ma solution t'ait plu !

    En fait il faut bien comprendre que la table "joueur_equipe" te permet de définir que "le joueur X fait partie de l'équipe Y, et à le poste Z).

    Si tu souhaites différencier les titulaires des remplaçants (qui font tous partie d'une équipe), il te faut un nouveau champ "titulaire" dans ta table "joueur_equipe". Si titulaire est égal à 1, alors ce joueur est bien titulaire dans l'équipe, s'il est égal à 0, il n'est que remplaçant (tu peux très bien faire l'inverse et avoir un champ "remplacant").

    Pour la requête, il te suffira de sélectionner les membres faisant partie de l'équipe (grâce à la jointure INNER JOIN), et filtrer sur les titulaires (clause WHERE).

    Voilà j'espère que mes explications étaient suffisament claires !
    A++

  9. #9
    Membre confirmé
    Inscrit en
    Janvier 2009
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 101
    Par défaut
    ah d'accord j'avais pas penser à ça, je cherche trop compliqué à chaque fois alors qu'il y a toujours une solution beaucoup plus facile.
    Merci de ton aide encore une fois

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

Discussions similaires

  1. [EJBQL] Problème de requete
    Par rivierem dans le forum Java EE
    Réponses: 3
    Dernier message: 16/10/2004, 10h05
  2. Problème sous requete MySQL
    Par gavelin dans le forum Langage SQL
    Réponses: 3
    Dernier message: 20/07/2004, 10h36
  3. Problème de Requete...
    Par sebiv dans le forum Langage SQL
    Réponses: 6
    Dernier message: 29/04/2004, 16h21
  4. Problème de requete avec Innodb
    Par silef dans le forum Requêtes
    Réponses: 3
    Dernier message: 14/04/2004, 12h54
  5. Problème de requete multis-selections
    Par tripper.dim dans le forum SQL
    Réponses: 9
    Dernier message: 03/09/2003, 13h08

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