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 :

Selection multi table avec filtre


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 27
    Par défaut Selection multi table avec filtre
    Bonsoir,

    avant toutes choses désolé pour ce titre pas nécessairement le plus explicite que l'on puisse imaginer.

    Je vous explique mon problème : je suis nul en MySQL et ca fait 3 heures que je tourne en rond. J'ai pris connaissance des FAQ sans guère plus de résultats...

    Voici le schéma :
    • 2 tables distinctes (stage_description et stage_date)
    • Ces 2 tables ont le champs "circuit" en commun
    • Il existe plusieurs champs utiles dans la table stage_date (que je souhaite recuperer)
    • Un uméro ID unique existe dans la table stage_date. Pour un nom, il existe plusieurs dates.
    • Il existe un champ "catégorie" qui va m'être vital pour mon affichage en tableau


    Je souhaite via une requête récupérer toutes les données des stages ayant une certaine valeur de champ "catégorie" (de la table stage_description).

    J'ai donc utilisé de deux approches :
    • le renommage
    • la jointure (où je nage plus que profondément )


    J'ai pu obtenir via la requête suivante mes stages ayant le même nom :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT stage_date.*
    FROM stage_description AS sde,stage_date AS sda
    WHERE sde.circuit = sda.circuit
    Le GROUP BY sda.id ne semble pas être vital pour bien avoir les doublons (même nom mais ID différent). J'ai bien mes 3 enregistrements.

    Mais si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT sde.*
    FROM stage_description as sde,stage_date as sda
    WHERE sde.categorie = "weekend"
    J'obtiens aussi 3 résultats alors que je ne devrais en avoir qu'un. Je n'ai qu'une seule description ayant pour catégorie "weekend"

    Je peux "filouter" en utilisant un GROUP BY categorie mais je ne sais pas si c'est "normal".

    Et pour finir, j'ai fait la requête juxtant la recherche de la valeur pour sde.categorie et les valeurs "circuit" correspondante entre les tables... mais je n'obtiens absolument aucun résultat...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT sda.*
    FROM stage_description as sde,stage_date as sda
    WHERE sde.categorie = "weekend"
    AND sde.circuit = sda.circuit
    Je suis au bord de la déprime... je sais que cela va vous paraitre facile mais si vous pouviez me donner la bonne requête et me l'expliquer, cela serait super sympa.

    Merci par avance de votre sollicitude.

  2. #2
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Par défaut
    salut,

    ce qui se rapproche le plus doit être ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT sda.*
    FROM stage_description AS sde,stage_date AS sda
    WHERE sde.categorie = "weekend"
    AND sde.circuit = sda.circuit
    écris de manière normalisé cela te donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT sda.*
    FROM stage_description AS sde
    JOIN stage_date AS sda
    ON sde.circuit = sda.circuit
    WHERE sde.categorie = "weekend"
    quand tu fais cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT stage_date.*
    FROM stage_description AS sde,stage_date AS sda
    WHERE sde.circuit = sda.circuit
    as tu une ligne avec la catégorie à weekend?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 27
    Par défaut
    Bonjour,

    La dernière requête donnée me fourni bien une ligne week-end mais aussi le reste du produit cartésien (4 lignes au total en somme)

    Par contre, après une vérification sur le résultat étonnant, j'ai vérifié un détail...

    Aucun stage n'était dans les "weekend"

    Décidement il faut que je dorme...

    Je suis désolé du dérangement mais ma dernière requête (celle que tu as reprise en première) fonctionne.

    A défaut de chercher une réponse sur la requête (grumph désolé), peux-tu me dire la différence entre ta première et ta seconde requête ? Cela change-t-il quoique ce soit d'utiliser un JOIN plutôt qu'un renommage dans le FROM ?

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    Billets dans le blog
    14
    Par défaut
    JOIN est l'opérateur normalisé pour les jointures depuis 1992.
    FROM...WHERE est l'ancienne syntaxe, obsolète donc depuis 1992.

    En dehors de cette évolution syntaxique, elle présente l'avantage de rendre les requêtes plus faciles à lire en séparant bien ce qui relève de la jointure et ce qui relève de la restriction sur les données. Par conséquent, elles sont aussi plus faciles à debugguer, surtout quand les jointures sont nombreuses.

    Je ne compte plus le nombre d'appel à l'aide dans nos forums où à la requête écrite avec l'ancienne syntaxe posait un problème qui s'est trouvé résolu en réécrivant simplement celle-ci avec la nouvelle syntaxe.

    Ajoutons que dans certains cas, l'ancienne syntaxe ne donne pas forcément le même résultat que la nouvelle et que le plan d'exécution de la requête par le SGBD peut être différent.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 !

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 27
    Par défaut
    Bon bah on va essayer de passer à la bonne synthaxe alors

    Par contre, je n'ai jamais bien compris les différences entre JOIN, INNER JOIN, OUTER JOIN, LEFT JOIN et RIGHT JOIN... Je sais bien qu'il y a grande quantité de FAQ et tuto la dessus mais je n'arrive pas à comprendre ?!

    En tout cas merci pour votre aide

  6. #6
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    Billets dans le blog
    14
    Par défaut
    JOIN ou INNER JOIN (INNER est facultatif) = jointure interne.
    Seules les lignes des deux tables ayant une correspondance par la con,dition de jointure seront retournées.

    LEFT JOIN ou LEFT OUTER JOIN (OUTER est facultatif) = jointure externe gauche.
    Toutes les lignes de la première table (celle de gauche) seront retournées et leur correpondance dans la table de droite par la condition de jointure sera indiquée si elle existe, NULL si elle n'existe pas.

    RIGHT JOIN ou RIGHT OUTER JOIN = Jointure externe droite.
    Idem LEFT sauf que c'est toutes les lignes de la table de droite qui seront retournées.

    Exemples...
    Soit la relation :
    Personne -0,n----Diriger----1,1- Projet

    Ca donne les tables :
    Personne (PER_Id, PER_Nom, PER_Prenom...)
    Projet (PRJ_Id, PRJ_Intitule, PRJ_IdResponsable...)

    On peut y mettre les données suivantes :
    Personne (PER_Id, PER_Nom, PER_Prenom...)
    1, 'Leménager', 'Philippe'
    2, 'Depardieu', 'Gérard'
    3, 'Brouard', 'Frédéric'
    4, 'Carré', 'Isabelle'

    Projet (PRJ_Id, PRJ_Intitule, PRJ_IdResponsable...)
    1, 'CinéDoc', 1
    2, 'Cours SQL', 3

    Liste des projets avec le nom de leur responsable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT pj.PRJ_Intitule AS Projet,
      pr.PER_Nom || ' ' || pr.PER_Prenom AS Nom_Responsable
    FROM Projet AS pj
    INNER JOIN Personne AS pr ON pj.PRJ_IdResponsable = pr.PER_Id
    ORDER BY pj.PRJ_Intitule
    Résultat :
    Projet, Nom_Responsable
    'CinéDoc', 'Leménager Philippe'
    'Cours SQL', 'Brouard Frédéric'

    Liste des personnes et les projets dont elles sont responsable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT pr.PER_Nom || ' ' || pr.PER_Prenom AS Personne,
      pj.PRJ_Intitule AS Projet,
    FROM Personne AS pr
    LEFT OUTER JOIN Projet AS pj ON pr.PER_Id = pj.PRJ_IdResponsable
    ORDER BY pr.PER_Nom
    Résultat :
    Personne, Projet
    'Brouard Frédéric', 'Cours SQL'
    'Carré Isabelle', NULL
    'Depardieu Gérard', NULL
    'Leménager Philippe', 'CinéDoc'

    Pour plus d'explication et les autres types de jointures, voir l'article de SQLPro.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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. SELECT multi Table avec pointeur dynamique
    Par gabouille dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 11/12/2013, 14h41
  2. Réponses: 4
    Dernier message: 27/03/2012, 17h15
  3. [MySQL] Requete SELECT multi-tables avec un ORDER BY
    Par Twenty4 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 22/12/2010, 02h36
  4. update d'un champ avec select multi-table
    Par maxvador dans le forum Hibernate
    Réponses: 1
    Dernier message: 23/09/2009, 11h54
  5. Sélection multi table avec condition
    Par iuz dans le forum Langage SQL
    Réponses: 8
    Dernier message: 05/05/2004, 15h04

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