Discussion: requête multi tables

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    août 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2013
    Messages : 16
    Points : 4
    Points
    4

    Par défaut requête multi tables

    Bonjour,

    Je ne parviens pas à effectuer une requête SQL portant sur plusieurs tables.

    Voici ma requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $reponse = $connection->query("SELECT *
    	FROM T_TITRES, T_AUTEURS, T_EDITEURS, T_BIBLIOTHEQUE, T_COLLECTIONS, T_SOUSCOLLECTIONS
    	WHERE T_COLLECTIONS.COLLECTION_ID = '".$_POST['selectCollection']."'
    	AND T_SOUSCOLLECTIONS.SOUSCOLLECT_ID IS NULL
    	WHERE T_TITRES.COLLECTION_ID = T_COLLECTIONS.COLLECTION_ID
    	AND T_TITRES.SOUSCOLLECT_ID = T_SOUSCOLLECTIONS.SOUSCOLLECT_ID");
    Il s'agit de récupérer les champs suivants :

    - TOME ET TITRE de la table T_TITRES
    - AUTEUR de la table T_AUTEURS
    - EDITEUR de la table T_EDITEURS
    - BIBLIOTHEQUE de la table T_BIBLIOTHEQUE
    - COLLECTION de la table T_COLLECTIONS
    - SOUSCOLLECTION de la table T_SOUSCOLLECTIONS


    J'espère trouver l'aide d'une âme charitable. Merci d'avance.

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    juillet 2005
    Messages
    28 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : juillet 2005
    Messages : 28 459
    Points : 42 321
    Points
    42 321

    Par défaut

    Il faut une jointure pour chaque table en utilisant JOIN.
    Et on ne met pas directement dans une requête une donnée saisie par un utilisateur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $sth = $connection->prepare('SELECT TOME, TITRE, AUTEUR, EDITEUR, BIBLIOTHEQUE, COLLECTION, SOUSCOLLECTION
    	FROM T_TITRES
            JOIN T_AUTEURS ON T_AUTEURS.TITRE_ID = T_TITRES.TITRE_ID
            ........
            WHERE T_COLLECTIONS.COLLECTION_ID = :collection_id');
    $sth->execute(array(':collection_id'=>$_POST['selectCollection']));
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre éprouvé Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    septembre 2002
    Messages
    751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : septembre 2002
    Messages : 751
    Points : 1 178
    Points
    1 178

    Par défaut

    Déjà il y a deux WHERE. Un seul suffit.

    D'autres te diront qu'on ne met pas un paramètre comme tu le fais dans une requête. On utilise prepare.

    ... B

    PS : B signifie "devant C".

    PS2 : il est fatigué badaze...
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    août 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2013
    Messages : 16
    Points : 4
    Points
    4

    Par défaut

    Et on ne met pas directement dans une requête une donnée saisie par un utilisateur
    Merci pour ce conseil, je ne le savais pas. Je débute en PHP.


    En suivant l'exemple de Sabotage, ma requête ne fonctionne pas.

    Ci-joint un schema de ma base de données.

    BIBLIOTHEQUE.pdf

  5. #5
    Membre éprouvé Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    septembre 2002
    Messages
    751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : septembre 2002
    Messages : 751
    Points : 1 178
    Points
    1 178

    Par défaut

    Si tu as écrit une requête poste la.
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    août 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2013
    Messages : 16
    Points : 4
    Points
    4

    Par défaut

    Effectivement, ce serait mieux.

    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
    if (empty($_POST['selectSousCollection'])) {
    	$reponse = $connection->prepare('SELECT TOME, TITRE, AUTEUR, EDITEUR, BIBLIOTHEQUE, COLLECTION, SOUSCOLLECTION
    	FROM T_TITRES, T_AUTEURS, T_EDITEURS, T_BIBLIOTHEQUE, T_COLLECTIONS, T_SOUSCOLLECTIONS
    		RIGHT JOIN T_AUTEURS ON T_AUTEURS.AUTEUR_ID = T_TITRES.AUTEUR_ID
    		RIGHT JOIN T_EDITEURS ON T_EDITEURS.EDITEUR_ID = T_TITRES.EDITEUR_ID
    		RIGHT JOIN T_BIBLIOTHEQUE ON T_BIBLIOTHEQUE.BIBLIOTHEQUE_ID = T_TITRES.BIBLIOTHEQUE_ID
    		RIGHT JOIN T_COLLECTIONS ON T_COLLECTIONS.COLLECTION_ID = T_TITRES.COLLECTION_ID
    		RIGHT JOIN T_SOUSCOLLECTIONS ON T_SOUSCOLLECTIONS.SOUSCOLLECT_ID = T_TITRES.SOUSCOLLECT_ID
    			WHERE T_COLLECTIONS.COLLECTION_ID = :collection_id AND T_SOUSCOLLECTIONS.SOUSCOLLECT_ID IS NULL');
    	$reponse->execute(array(':collection_id'=>$_POST['selectCollection']));
    }
    else {
    	$reponse = $connection->prepare('SELECT TOME, TITRE, AUTEUR, EDITEUR, BIBLIOTHEQUE, COLLECTION, SOUSCOLLECTION
    	FROM T_TITRES, T_AUTEURS, T_EDITEURS, T_BIBLIOTHEQUE, T_COLLECTIONS, T_SOUSCOLLECTIONS
    		RIGHT JOIN T_AUTEURS ON T_AUTEURS.AUTEUR_ID = T_TITRES.AUTEUR_ID
    		RIGHT JOIN T_EDITEURS ON T_EDITEURS.EDITEUR_ID = T_TITRES.EDITEUR_ID
    		RIGHT JOIN T_BIBLIOTHEQUE ON T_BIBLIOTHEQUE.BIBLIOTHEQUE_ID = T_TITRES.BIBLIOTHEQUE_ID
    		RIGHT JOIN T_COLLECTIONS ON T_COLLECTIONS.COLLECTION_ID = T_TITRES.COLLECTION_ID
    		RIGHT JOIN T_SOUSCOLLECTIONS ON T_SOUSCOLLECTIONS.SOUSCOLLECT_ID = T_TITRES.SOUSCOLLECT_ID
    			WHERE T_COLLECTIONS.COLLECTION_ID = :collection_id AND T_SOUSCOLLECTIONS.SOUSCOLLECT_ID = :souscollection_id');
    	$reponse->execute(array(':collection_id'=>$_POST['selectCollection']));
    	$reponse->execute(array(':souscollection_id'=>$_POST['selectSousCollection']));
    }

  7. #7
    Membre éprouvé Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    septembre 2002
    Messages
    751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : septembre 2002
    Messages : 751
    Points : 1 178
    Points
    1 178

    Par défaut

    Pourquoi utilises tu right join plutôt que join ( ou inner join) ?
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    août 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2013
    Messages : 16
    Points : 4
    Points
    4

    Par défaut

    J'ai essai RIGHT JOIN, parce que JOIN ne fonctionnait pas.

  9. #9
    Membre éprouvé Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    septembre 2002
    Messages
    751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : septembre 2002
    Messages : 751
    Points : 1 178
    Points
    1 178

    Par défaut

    Il te reste LEFT JOIN.... Non je rigole.

    Est-ce que si tu fais une requête toute simple cela sort quelque chose ? En d'autres termes, es-tu sûr que tu te connectes bien à la BDD ou qu'il n'y a pas d'erreur dans ta requête ?
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    août 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2013
    Messages : 16
    Points : 4
    Points
    4

    Par défaut

    Oui, les requêtes simples fonctionnent parfaitement.

  11. #11
    Membre éprouvé Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    septembre 2002
    Messages
    751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : septembre 2002
    Messages : 751
    Points : 1 178
    Points
    1 178

    Par défaut

    Refais une requête avec JOIN et sans paramètre.
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  12. #12
    Membre éprouvé Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    septembre 2002
    Messages
    751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : septembre 2002
    Messages : 751
    Points : 1 178
    Points
    1 178

    Par défaut

    Il faudrait que tu fasses ta requête dans phpmyadmin.

    Je te conseille d'y aller pas à pas.

    Tu commences par lier deux tables. Si ça va tu passes à trois, etc..
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  13. #13
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    juillet 2005
    Messages
    28 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : juillet 2005
    Messages : 28 459
    Points : 42 321
    Points
    42 321

    Par défaut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND T_SOUSCOLLECTIONS.SOUSCOLLECT_ID IS NULL
    C'est quoi cette condition ? L'id d'une table ne peut pas être NULL.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  14. #14
    Candidat au Club
    Profil pro
    Inscrit en
    août 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2013
    Messages : 16
    Points : 4
    Points
    4

    Par défaut

    Je ne suis pas chez moi. Je ferai les essais que vous me proposez en rentrant ou demain.

    C'est quoi cette condition ? L'id d'une table ne peut pas être NULL.
    Effectivement, il y'a une erreur. Ce n'est pas SOUSCOLLECT_ID de la table T_SOUSCOLLECTIONS qui peut être NULL. Ça c'est la clé primaire. C'est dans T_TITRES.

    Donc d'abord correction et ensuite je vous tiens au courant.

  15. #15
    Candidat au Club
    Profil pro
    Inscrit en
    août 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2013
    Messages : 16
    Points : 4
    Points
    4

    Par défaut

    Bonjour,

    J'ai donc corrigé ma requête, mais sans succès.

    Je me suis rendu compte ce matin, que, en fait, c'est la requête préparée qui ne fonctionne pas.

    J'ai procédé à un essai avec la requête que je testais à l'origine.

    C'était celle-ci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $reponse = $connection->query("SELECT TOME, TITRE, COUVERTURE, RESUME
    	FROM T_TITRES
    	WHERE COLLECTION_ID = '".$_POST['selectCollection']."'
    	AND SOUSCOLLECT_ID IS NULL");
    Là, pas de problème.

    J'ai donc procédé en utilisant une requête préparée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $reponse = $connection->prepare("SELECT TOME, TITRE, COUVERTURE, RESUME
    	FROM T_TITRES
    	WHERE COLLECTION_ID = :collection_id
    	AND SOUSCOLLECT_ID IS NULL");
    $reponse->execute(array(':collection_id' => $_POST['selectCollection']));
    Et ceci ne fonctionne pas.

  16. #16
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    juillet 2005
    Messages
    28 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : juillet 2005
    Messages : 28 459
    Points : 42 321
    Points
    42 321

    Par défaut

    L'erreur ne me saute pas aux yeux.
    Il faudrait aller un peu plus loin que "ne fonctionne pas".

    Tu as activé les exceptions PDO ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    Par contre encore une fois, les jointures se font avec JOIN pas dans le WHERE.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  17. #17
    Membre éprouvé Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    septembre 2002
    Messages
    751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : septembre 2002
    Messages : 751
    Points : 1 178
    Points
    1 178

    Par défaut

    @Neelix57.

    As tu testé ta requête dans phpmyadmin ?
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  18. #18
    Candidat au Club
    Profil pro
    Inscrit en
    août 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2013
    Messages : 16
    Points : 4
    Points
    4

    Par défaut

    Il faudrait aller un peu plus loin que "ne fonctionne pas".
    La requête ne retourne aucun résultat. (Ma page reste blanche)

    Tu as activé les exceptions PDO ?
    Je viens de les activer, mais qu'est-ce que cela doit-il changer ?

    Par contre encore une fois, les jointures se font avec JOIN pas dans le WHERE
    J'avais compris, j'ai simplement réutilisé cette requête, parce que elle est opérationnelle.

  19. #19
    Candidat au Club
    Profil pro
    Inscrit en
    août 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2013
    Messages : 16
    Points : 4
    Points
    4

    Par défaut

    Non, mais je le répète, ce n'est que la requête préparée qui ne me retourne aucun résultat.

  20. #20
    Rédacteur/Modérateur
    Avatar de jreaux62
    Homme Profil pro
    Webdesigner
    Inscrit en
    août 2008
    Messages
    10 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Arts - Culture

    Informations forums :
    Inscription : août 2008
    Messages : 10 216
    Points : 20 306
    Points
    20 306

    Par défaut

    Bonjour,

    1/ il faut revoir les fondamentaux :



    Et si tu reviens sans arrêt à tes anciennes requêtes (fausses, pas corrigées,...), on ne peut rien de plus pour toi.

    2/ voilà une requête SIMPLE, avec 1 paramètre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $reponse = $connection->prepare("SELECT TOME, TITRE, COUVERTURE, RESUME
    	FROM T_TITRES
    	WHERE COLLECTION_ID = :collection_id");
    $reponse->execute(array(':collection_id' => 25)); // (pour test, mettre un id existant effectivement en Bdd)
    $nombre_results = $reponse->rowCount();
    echo 'nombre de resultats : '.$nombre_results;
    3/ Avec plusieurs paramètres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $reponse = $connection->prepare("SELECT TOME, TITRE, COUVERTURE, RESUME
    	FROM T_TITRES
    	WHERE COLLECTION_ID = :collection_id
    	AND SOUS_COLLECTION_ID = :sous_collection_id");
    $reponse->execute(array(
       ':collection_id' => 25,
       ':sous_collection_id' => 2
       ));
    $nombre_results = $reponse->rowCount();
    echo 'nombre de resultats : '.$nombre_results;
    4/ Quant à la gestion/affichage des erreurs PDO :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $reponse = $connection->prepare("SELECT TOME, TITRE, COUVERTURE, RESUME
    	FROM T_TITRES
    	WHERE COLLECTION_ID = :collection_id");
    try {
       $reponse->execute(array(':collection_id' => 25)); // (pour test, mettre un id existant effectivement en Bdd)
    catch(PDOException $e){
    	echo 'ERREUR PDO dans ' . $e->getFile().' L.' . $e->getLine().' : ' . $e->getMessage();
    }
       $nombre_results = $reponse->rowCount();
    echo 'nombre de resultats : '.$nombre_results;
    "Si tu suis le chemin qui s'appelle « plus tard », tu arriveras à la place qui s'appelle « jamais »."
    François Camille Prévot (1910-1996), instituteur puis Directeur d'école et... mon grand-père.
    "Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire arrivent aisément."
    Nicolas Boileau-Despréaux (1636-1711).
    Mes tutos DVP
    Gestion-Affichage de Nouvelles
    Affichage en tableau HTML
    Fonctions de redimensionnement d'images

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Problème de requête multi tables
    Par arnold002 dans le forum Requêtes
    Réponses: 1
    Dernier message: 14/03/2010, 08h24
  2. problème requête - 2 tables - count - distinct
    Par avironix2 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 27/12/2007, 10h16
  3. problème de requête multi-table
    Par dergips dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 23/07/2007, 18h21
  4. Problème requête ALTER TABLE
    Par 1tsiMat dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 29/06/2006, 13h16
  5. Problème DELETE multi-tables
    Par Gwipi dans le forum Requêtes
    Réponses: 5
    Dernier message: 22/05/2006, 08h48

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