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

Requêtes MySQL Discussion :

Jointure entre 6 tables


Sujet :

Requêtes MySQL

  1. #1
    Membre averti Avatar de ddaweb
    Homme Profil pro
    Webmaster amateur
    Inscrit en
    Janvier 2013
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Webmaster amateur
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Janvier 2013
    Messages : 329
    Points : 430
    Points
    430
    Par défaut Jointure entre 6 tables
    bonsoir,

    Je suis de retour pour un problème de jointure qui me donne une erreur Mysql :

    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 'AS type ON type.cours_type_id=classe.cours_classe_type_id INNER JOIN d_cours' at line 4
    Voici le code de ma fonction :
    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
    function RechercheCoursSection ($section) {
    	$reponse=mysql_query("SELECT classe.*, section.*, type.*, couleur.*, horaire.*, jour.* 
    		FROM d_cours_classe AS classe 
    		INNER JOIN d_cours_section AS section ON section.cours_section_id=classe.cours_classe_id 
    		INNER JOIN d_classe cours_type AS type ON type.cours_type_id=classe.cours_classe_type_id 
    		INNER JOIN d_cours_classe_couleur AS couleur ON couleur.cours_classe_couleur_id=classe.cours_classe_couleur_id 
    		INNER JOIN d_cours_horaire AS horaire ON horaire.cours_horaire_classe_id=classe.cours_classe_id 
    		INNER JOIN d_cours_jours AS jour ON jour.cours_jour_id=horaire.cours_horaire_jours_id 
    		WHERE cours_section=$section && cours_classe_actif='oui' 
    		ORDER BY jours.cours_jours_numero, horaire.cours_horaire_debut, classe.cours_classe_nom ASC") or die(mysql_error()); // -------- récupèrer les codes postaux de la table des codes postaux
    	while ($in= mysql_fetch_array($reponse)) {
    		$i++;
    		$cours_jour_nom=$in['cours_jours_nom'];
    		$cours_horaire_debut=$in['cours_horaire_debut'];
    		$cours_horaire_fin=$in['cours_horaire_fin'];
    		$cours_type=$in['cours_type_nom'];
    		$cours_classe=$in['cours_classe_nom'];
    		$cours_classe_description=$in['cours_classe_site'];
     
    		$cours_array[$i][jour]=$cours_jour_nom;
    		$cours_array[$i][debut]=$cours_horaire_debut;
    		$cours_array[$i][fin]=$cours_horaire_fin;
    		$cours_array[$i][type]=$cours_type;
    		$cours_array[$i][classe]=$cours_classe;
    		$cours_array[$i][description]=$cours_classe_description;
    	}
    	return ($cours_array);
    }
    Je cherche sur la toile, mais rien ne m'a encore permis de trouver une solution.

    Si quelqu'un a une idée, je prends

    @+
    ddaweb

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Tu as un espace La première chose à faire quand tu debugues c'est de circonscrire ton problème.
    Si tu l'avais fait tu aurais vu que le problème se trouvait sur la 4ème ligne.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre averti Avatar de ddaweb
    Homme Profil pro
    Webmaster amateur
    Inscrit en
    Janvier 2013
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Webmaster amateur
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Janvier 2013
    Messages : 329
    Points : 430
    Points
    430
    Par défaut
    Oui je l'avais remarqué et corrigé, mais cela ne change rien à mon problème (pardon de ne pas être venu corrigé, mais j'étais absorbé par une erreur avec le code ci-dessous ; il y a encore d'autres erreurs que j'ai aussi rectifiées sans effet ... mieux vaut partir du code ci-dessous).

    J'ai tenté la vielle syntaxe et cela fonctionne :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT * 
    FROM d_cours_classe,  d_cours_section, d_cours_type, d_cours_classe_couleur, d_cours_horaire, d_cours_jours 
    WHERE (d_cours_section.cours_section_id=d_cours_classe.cours_classe_section_id) 
    && (d_cours_type.cours_type_id=d_cours_classe.cours_classe_type_id) 
    && (d_cours_classe_couleur.cours_classe_couleur_id=d_cours_classe.cours_classe_couleurs_id) 
    && (d_cours_horaire.cours_horaire_classe_id=d_cours_classe.cours_classe_id) 
    && (d_cours_jours.cours_jours_id=d_cours_horaire.cours_horaire_jours_id) 
    && cours_section='4C' && cours_classe_actif='oui' 
    ORDER BY cours_jours_numero, cours_horaire_debut, cours_classe_nom ASC

    Petite infos : je vais chercher des infos dans toutes les tables ... voilà quand on veut faire quelque chose d'hyper paramétrable (développement pour mon club de chien, mais devrait aussi servir dans un autre club avec d'autres paramètres)

  4. #4
    Membre averti Avatar de ddaweb
    Homme Profil pro
    Webmaster amateur
    Inscrit en
    Janvier 2013
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Webmaster amateur
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Janvier 2013
    Messages : 329
    Points : 430
    Points
    430
    Par défaut
    Je voulais tenter les jointures avec "JOIN" ... cela ne m'a pas trop réussit.
    D'habitude je l'écrivais avec le "WHERE", cette tentative pour apprendre une autre manière peut-être plus propre ?

  5. #5
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    essaie avec ceci
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    SELECT * 
    FROM 
        d_cours_classe
            INNER JOIN d_cours_section        ON d_cours_classe.cours_classe_section_id  = d_cours_section.cours_section_id
            INNER JOIN d_cours_type           ON d_cours_classe.cours_classe_type_id     = d_cours_type.cours_type_id
            INNER JOIN d_cours_classe_couleur ON d_cours_classe.cours_classe_couleurs_id = d_cours_classe_couleur.cours_classe_couleur_id
            INNER JOIN d_cours_horaire        ON d_cours_classe.cours_classe_id          = d_cours_horaire.cours_horaire_classe_id
                INNER JOIN d_cours_jours      ON d_cours_horaire.cours_horaire_jours_id  = d_cours_jours.cours_jours_id
    WHERE
       cours_section          = '4C' 
       AND cours_classe_actif = 'oui'  
    ORDER BY 
        cours_jours_numero, 
        cours_horaire_debut, 
        cours_classe_nom

  6. #6
    Membre averti Avatar de ddaweb
    Homme Profil pro
    Webmaster amateur
    Inscrit en
    Janvier 2013
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Webmaster amateur
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Janvier 2013
    Messages : 329
    Points : 430
    Points
    430
    Par défaut
    La réponse dans phpmyadmin donne la même réponse que mon code
    Merci pour ta réponse.

    Dans l'absolu, quelle est le meilleur code, voir le plus efficace ?

  7. #7
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Dans tous les cas : les jointures.
    Ne serait-ce que parce qu'il est possible d'avoir un contrôle sur la jonction INNER, LEFT, RIGHT, OUTER tandis qu'avec le WHERE nada.

  8. #8
    Membre averti Avatar de ddaweb
    Homme Profil pro
    Webmaster amateur
    Inscrit en
    Janvier 2013
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Webmaster amateur
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Janvier 2013
    Messages : 329
    Points : 430
    Points
    430
    Par défaut
    J'ai déjà pu remarquer l'avantage du JOIN LEFT ou RIGHT ... avant je faisais 2 requêtes pour arriver à la même chose.

    Dans le cas de ce post, en fin de compte je n'y vois pas trop d'intérêt directement (peut-être du point de vue des ressources utilisées par la fonction JOIN mieux interprétée par le serveur ?).
    J'avoue avoir découvert sur ce forum cette manière de coder les jointures il y a peu ... du coup j'ai voulu tenter de coder ainsi, p'te trop de tables en une fois

    Dans le but d'apprendre, si tu peux développer un peu, d'une manière pas trop technique car j'ai appris à coder de manière autodidacte, mais suivant mes besoins du moment, pas dans son ensemble malheureusement ... maintenant je creuse un peu plus.

  9. #9
    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 : 39
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Faire des jointures et pas des liaisons par WHERE permet d'éviter de mélanger les conditions de jointure et les conditions de recherche. Cela peut être très pratique lorsque tu écris ta requête de façon dynamique à partir de champs renseignés ou non dans un formulaire, histoire d'éviter les produits cartésiens (remonter 350 000 lignes au lieu de 15, c'est pas terrible)

    A lire sur le sujet : Le SQL de A à Z - les Jointures
    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]

  10. #10
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par ddaweb Voir le message
    J'ai tenté la vielle syntaxe et cela fonctionne :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT * 
    FROM d_cours_classe,  d_cours_section, d_cours_type, d_cours_classe_couleur, d_cours_horaire, d_cours_jours 
    WHERE (d_cours_section.cours_section_id=d_cours_classe.cours_classe_section_id) 
    && (d_cours_type.cours_type_id=d_cours_classe.cours_classe_type_id) 
    && (d_cours_classe_couleur.cours_classe_couleur_id=d_cours_classe.cours_classe_couleurs_id) 
    && (d_cours_horaire.cours_horaire_classe_id=d_cours_classe.cours_classe_id) 
    && (d_cours_jours.cours_jours_id=d_cours_horaire.cours_horaire_jours_id) 
    && cours_section='4C' && cours_classe_actif='oui' 
    ORDER BY cours_jours_numero, cours_horaire_debut, cours_classe_nom ASC
    1) Il vaut mieux éviter la guerre des étoiles !

    2) Les jointures s'écrivent depuis plus de 20 ans avec l'opérateur JOIN ; il serait temps de s'y mettre !

    3) Les parenthèses dans les conditions de jointure ou de restriction sont le plus souvent inutiles, sauf en cas de mélange de AND et de OR.

    4) L'utilisation d'alias pour les tables est fortement recommandé dès qu'il y a plus d'une table dans la requête. Cela facilite l'écriture et la lecture de celle-ci. Il faut ensuite utiliser systématiquement ces alias devant chaque colonne nommée pour savoir facilement de quelle table elle vient.

    5) En SQL, l'opérateur logique "et" s'écrit AND et non pas &&.

    6) Un code indenté et aéré est plus agréable à lire et à débugguer.

    7) Le tri ascendant est le tri par défaut. Il est donc inutile de préciser ASC dans la partie ORDER BY quand vous n'avez que des colonnes triées en ascendant.

    Si la colonne "cours_section" fait bien partie de la table "d_cours_section" et si la colonne "cours_classe_actif" fait bien partie de la table "d_cours_classe" alors cette requête devrait être équivalente à la votre et donc fonctionner de la même manière. Je vous laisse cependant compléter les alias des colonnes pour celles qui figurent dans la partie ORDER BY et remplacer l'étoile par les colonnes dont vous avez besoin dans la partie SELECT.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT les_colonnes_necessaires_et_pas_etoile
    FROM d_cours_classe c 
    INNER JOIN d_cours_section s ON s.cours_section_id = c.cours_classe_section_id
    INNER JOIN d_cours_type t ON t.cours_type_id = c.cours_classe_type_id
    INNER JOIN d_cours_classe_couleur cl ON cl.cours_classe_couleur_id = c.cours_classe_couleurs_id
    INNER JOIN d_cours_horaire h ON h.cours_horaire_classe_id = c.cours_classe_id
    	INNER JOIN d_cours_jours j ON j.cours_jours_id = h.cours_horaire_jours_id
    WHERE s.cours_section = '4C' 
    	AND c.cours_classe_actif = 'oui'
    ORDER BY cours_jours_numero, cours_horaire_debut, cours_classe_nom
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  11. #11
    Membre averti Avatar de ddaweb
    Homme Profil pro
    Webmaster amateur
    Inscrit en
    Janvier 2013
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Webmaster amateur
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Janvier 2013
    Messages : 329
    Points : 430
    Points
    430
    Par défaut
    Merci CinePhil pour toute ses infos, certaines chose je savais, mais codais comme j'avais vu lors de mes recherches : je fais devoir changer cela absolument.
    Comme je veux aller plus loin qu'avant et coder au mieux et surtout plus efficace, c'est très intéressant.

    Je constate que tu as bien compris ma logique concernant les tables et nom des champs ... le 'd_' devant le nom de la table correspond à DATA et les champs reprennent le nom de la table avec le complément du nom du champs : il devient ainsi presque impossible d'obtenir le même nom de champs en cas de jointure.

    Concernant le AND et && ... je vais dire que c'est par habitude et surtout fainéantise (et cela fonctionne toujours ), le OR je l'indique par contre au lieu de ||.

    Les alias sont nouveaux pour moi et j'avoue encore avoir du mal avec à la lecture, je mets d'ailleurs les parenthèse pour cela ... habitudes quand tu nous tient

    Je suis en fait occupé de faire des choses qui auraient du être faites depuis le début ... pas facile de normaliser quelque chose et adapter tous les scripts qui vont avec.

  12. #12
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Et donc, est-ce ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

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

Discussions similaires

  1. PROBLEME DE JOINTURE ENTRE DEUX TABLE
    Par DarkMax dans le forum Langage SQL
    Réponses: 13
    Dernier message: 13/01/2005, 15h11
  2. Jointure entre 3 tables
    Par zigune dans le forum Langage SQL
    Réponses: 9
    Dernier message: 15/11/2004, 16h04
  3. Jointure entre deux tables et résultat
    Par Asdorve dans le forum Langage SQL
    Réponses: 2
    Dernier message: 02/06/2004, 14h50
  4. [jointure]requete possible de double jointure entre 2 tables
    Par akira_le_gaucher dans le forum Langage SQL
    Réponses: 4
    Dernier message: 11/05/2004, 15h03
  5. Jointure entre 2 tables et OR
    Par PyRoFlo dans le forum Requêtes
    Réponses: 2
    Dernier message: 02/02/2004, 18h42

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