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

 MySQL Discussion :

Résultat non attendu sur jointure


Sujet :

MySQL

  1. #1
    Membre régulier
    Inscrit en
    Janvier 2008
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 165
    Points : 84
    Points
    84
    Par défaut Résultat non attendu sur jointure
    bonjour, j'ai un soucis avec une requete sql , je ne suis pas un expert (loin de là) et je ne comprend pas le comportement de la requete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SELECT t.id, t.minor, t.major
    FROM toto t
    JOIN (
     
    SELECT MAX( mx.major ) AS max_major
    FROM toto mx
    )m ON m.max_major = t.major
     
    JOIN (
    SELECT MAX( j.minor ) AS max_minor
    FROM toto j
    )j ON j.max_minor = t.minor
    resultat attendus : recuperer id,major,minor sur la ligne qui a le plus grand major , dans ce resultat recuperer la ligne qui a le plus grand minor.

    comportement

    si la première jointure renvois plusieurs ligne le resultat est OK

    par contre si la première jointure renvois 1 seul ligne le resultat est vide .....

    il est fort probable que la requete ne soit pas très bien ecrite , il y a peut être plus simple

    merci

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 786
    Points
    30 786
    Par défaut
    Quelque chose comme ça ?
    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
    SELECT  det.id
        ,   det.major
        ,   det.minor
    FROM    toto    det
    WHERE   EXISTS
            (   SELECT  NULL
                FROM    toto    mjv
                WHERE   det.major   = mjv.major
                    AND EXISTS
                        (   SELECT  NULL
                            FROM    toto    miv
                            HAVING  mjv.major   = MAX(miv.major)
                        )
                HAVING  det.minor   = MAX(mjv.minor)
            )
    ;
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre régulier
    Inscrit en
    Janvier 2008
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 165
    Points : 84
    Points
    84
    Par défaut resolue
    Un grand merci
    Ca marche impeccable, j'aurais mis du temps a trouver, je ne comprend pas trop pourquoi la mienne ne fonctionnait pas quand il y avait qu'une seule ligne en retour.... la data c'est un autre métier ;-) encore merci

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Citation Envoyé par bruno.rotrou Voir le message
    je ne comprend pas trop pourquoi la mienne ne fonctionnait pas quand il y avait qu'une seule ligne en retour....
    Vos sous requêtes ne sont pas corrélées.
    Du coup, la dernière sous requete revoit la version mineure la plus élevées, toutes versions majeures confondues.
    du coup, si vous avez par exemple dans vos données :
    1.5
    1.7
    1.8
    2.0
    2.3
    
    La dernière sous requete renvoi 8, alors qu'il faudrait qu'elle renvoi 3, en ne récupérant le max(minor) que pour les lignes où major = 2.

  5. #5
    Membre régulier
    Inscrit en
    Janvier 2008
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 165
    Points : 84
    Points
    84
    Par défaut sous requetes
    merci pour les explications

  6. #6
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 378
    Points : 19 054
    Points
    19 054
    Par défaut
    Salut Bruno.Roton

    Citation Envoyé par Bruno.Roton
    resultat attendus : recuperer id,major,minor sur la ligne qui a le plus grand major , dans ce resultat recuperer la ligne qui a le plus grand minor.
    Je ne sais pas si j'ai bien compris votre résultat.
    Dans un premier temps, vous recherchez le plus grand major.
    Dans un second temps, après avoir trouvé le plus grand major, vous recherchez le plus grand minor.

    Voici une solution plus courte :
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `test`
    --------------
     
    --------------
    CREATE TABLE `test`
    ( `id`       integer unsigned auto_increment NOT NULL primary key,
      `minor`    integer unsigned                NOT NULL,
      `major`    integer unsigned                NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    INSERT INTO `test` (`minor`,`major`) VALUES
      ( 12,  80),
      ( 15, 544),
      ( 33,  80),
      ( 37, 255),
      ( 33, 544),
      ( 74,  80),
      (  3, 544)
    --------------
     
    --------------
    select * from test
    --------------
     
    +----+-------+-------+
    | id | minor | major |
    +----+-------+-------+
    |  1 |    12 |    80 |
    |  2 |    15 |   544 |
    |  3 |    33 |    80 |
    |  4 |    37 |   255 |
    |  5 |    33 |   544 |
    |  6 |    74 |    80 |
    |  7 |     3 |   544 |
    +----+-------+-------+
    --------------
    select tb1.id, tb1.minor, tb1.major
    from            test as tb1
    left outer join test as tb2 on tb2.major > tb1.major
    left outer join test as tb3 on tb3.minor > tb1.minor and tb3.major = tb1.major
    where tb2.major is null and tb3.major is null
    --------------
     
    +----+-------+-------+
    | id | minor | major |
    +----+-------+-------+
    |  5 |    33 |   544 |
    +----+-------+-------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
     
    Appuyez sur une touche pour continuer...
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

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

Discussions similaires

  1. [Débutant] résultat non attendu ! ( problème d'algorithme )
    Par Ranzouz dans le forum MATLAB
    Réponses: 1
    Dernier message: 30/07/2015, 16h57
  2. [JAXB] Résultat non attendu
    Par SpeedOverflow dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 23/06/2011, 10h45
  3. sdelete et reaser : résultat non attendu
    Par DSGSLA dans le forum Sécurité
    Réponses: 4
    Dernier message: 16/03/2011, 11h17
  4. Résultat non attendu de l'opérateur Like
    Par idrysse31 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/03/2010, 12h01
  5. Réponses: 1
    Dernier message: 25/09/2008, 19h09

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