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

Langage SQL Discussion :

Simple Question Logique


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2003
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 44
    Points : 38
    Points
    38
    Par défaut Simple Question Logique
    Bonjour,
    j'ignore si la requête que je souhaite réaliser est possible, pouvez vous m'aider ?

    soit 2 tables :
    la table_t1 constituée de 2 champs id_t1, et pref_t1
    la table_t2 constituée de 3 champs id_t2, pref_t2, et data_t2
    table_t1
    id_t1 / pref_t1
    01 / null
    02 / null
    03 / e12a5
    04 / t1c9a
    05 / null
    06 / u8z45

    table_t2
    id_t2 / pref_t2 / data_t2
    01 / e12a5 / 10
    02 / e12a5 / 15
    03 / e12a5 / 18
    04 / t1c9a / 25
    05 / t1c9a / 19
    06 / t1c9a / 12
    07 / u8z45 / 95
    08 / u8z45 / 33
    09 / u8z45 / 10

    et voila le resultat que j'aimerais obtenir :
    id_t1 / pref_t1 / data_t2
    01 / null
    02 / null
    03 / e12a5 / 10
    04 / t1c9a / 12
    05 / null
    06 / u8z45 / 10
    c'est à dire tous les enregistrements de ma table_t1, mais s'il existe une correspondance entre table_t1 et table_t2 sur le champ "pref" alors je recupère seulement l'enregistrement de table_t2 qui contient la plus petite valeur dans le champ data_t2

    j'espère avoir été assez clair
    merci de vos réponses

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Oui c'est possible. Quel est votre SGBD et qu'avez-vous essayé ?

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2003
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 44
    Points : 38
    Points
    38
    Par défaut
    votre reponse sous entend que la requete SQL va être differente selon le SGBD ?
    j'utilise actuellement MySql

    En ce qui concerne qu'est ce que j'ai déjà essayé, je ne sais pas si votre question porte sur le système SGBD ou sur le type de requête?

    pour ce qui est de la seconde option j'ai toujours eu besoin de requêtes simples de jointures basiques alors là je n'ai rien essayé parce que je suis dépassé ;o(

    Cordialement

  4. #4
    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 : 61
    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 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Comme tu veux toutes les lignes de t1, même quand il n'y a pas de correspondance dans t2, tu as besoin d'une jointure externe.

    Ce n'est pas très difficile ; propose nous une requête et nous la corrigerons si besoin.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2003
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 44
    Points : 38
    Points
    38
    Par défaut
    Bjr CinePhil

    voici donc ma requete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      SELECT t1.id_t1,t2.pref_t2,t2.data_t2
        FROM table_t1 t1				
             LEFT OUTER JOIN table_t2 t2 
               ON t1.pref_t1 = t2.pref_t2
             LEFT OUTER JOIN table_t3 t3  -- parce qu'il y a aussi une table t3 
               ON t1.id_t1 = t3.id_t3	 -- il y a toujours pour toute valeur de t1.id_t1 une valeur t3.id_t3	
       WHERE t1.id_t1 > '01' -- juste pour qu'il y ait une condition
    ORDER BY t1.id_t1 DESC 		
       LIMIT 0,30;
    Merci de vous intéresser à mon triste sort mais pourquoi tenez vous absolument à voir ma requete puisque je ne maitrise plus du tout à ce niveau là ?

  6. #6
    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 : 61
    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 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    OK pour les jointures.
    il y a toujours pour toute valeur de t1.id_t1 une valeur t3.id_t3
    Donc pour cette jointure, tu aurais pu mettre une jointure interne INNER JOIN.

    La partie du besoin qui n'est pas couverte par ta requête est celle-ci :
    seulement l'enregistrement de table_t2 qui contient la plus petite valeur dans le champ data_t2
    Il faut donc chercher la valeur minimum (MIN) et faire un groupage par id_t1, pref_t1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT t1.id_t1, t1.pref_t1,
        MIN(t2.data_t2) AS min_data_t2
    FROM table_t1 t1                
    LEFT OUTER JOIN table_t2 t2 ON t1.pref_t1 = t2.pref_t2
    INNER JOIN table_t3 t3 ON t1.id_t1 = t3.id_t3
    WHERE t1.id_t1 > '01' -- juste pour qu'il y ait une condition
    GROUP BY t1.id_t1, t1.pref_t1
    ORDER BY t1.id_t1 DESC
    pourquoi tenez vous absolument à voir ma requete puisque je ne maitrise plus du tout à ce niveau là ?
    Reconnais que tu apprends plus de choses en te forçant à chercher un peu que si on t'avais donné directement la solution !

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2003
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 44
    Points : 38
    Points
    38
    Par défaut reponse en 3 points
    1) Très sincèrement merci beaucoup
    2) à partir de ta solution je teste dans tous les sens et je cherche à comprendre (et oui j'apprends bcq par l'exemple)
    3) tu dis :
    en te forçant à chercher un peu
    ... ! 3 jours que je suis dessus pfffff ! j'ai 50 ans et plus trop de temps devant moi

    Cordialement

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2003
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 44
    Points : 38
    Points
    38
    Par défaut POST SCRIPTUM
    re ... délolé mais ...
    c'est celle là que je ne comprends pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GROUP BY t1.id_t1, t1.pref_t1
    pourquoi juste ne suffisait pas ?
    s'il vous reste 3 minutes...

  9. #9
    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 : 61
    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 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Parce que la norme demande que toutes les colonnes du SELECT ne faisant pas l'objet d'une fonction de regroupement figurent dans le GROUP BY.
    MySQL est trop permissif avec une subtilité de la norme qui dit qu'on peut ne pas mettre toutes ces colonnes dans le GROUP BY si celles qui n'y sont pas dépendent directement de celle qui y est.

    Par exemple, si j'ai une table de personnes (prs_id, prs_nom, prs_prenom...)
    Je pourrais faire en MySQL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT prs_id, prs_nom, prs_prenom, COUNT(*)
    FROM personne
    INNER JOIN une_autre_table ON condition_de_jointure
    GROUP BY prs_id
    Les autres SGBDR ne l'autorisent pas alors que ce serait strictement conforme et donnerait un résultat juste.

    Mais si je fais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT p.prs_id, p.prs_nom, p.prs_prenom, prj.nom_projet, COUNT(*)
    FROM personne AS p
    INNER JOIN projet AS prj ON prj_id_responsable = p.prs_id
    GROUP BY prs_id
    MySQL a tort de l'autoriser car la valeur de nom_projet sera aléatoire. C'est pour ça que les autres SGBD l'interdisent tout le temps.

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2003
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 44
    Points : 38
    Points
    38
    Par défaut
    Merci.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 13/10/2005, 12h46
  2. Simple Question ....
    Par soltani.slim dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 25/08/2005, 18h11
  3. [langage] simple question ...
    Par perlgirl dans le forum Langage
    Réponses: 13
    Dernier message: 16/07/2004, 13h22
  4. PageControl -> Une simple question
    Par Invité dans le forum C++Builder
    Réponses: 4
    Dernier message: 08/05/2004, 09h19

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