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 :

Modification requete sql déjà compliqué !


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 65
    Points : 38
    Points
    38
    Par défaut Modification requete sql déjà compliqué !
    Bonjour,

    Pour un projet il me faut modifier cette requête SQL :
    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
    SELECT mv.id_mouvement
          , mv.id_membre_from
          , mv.id_membre_to
          , mv.id_base_from
          , mv.id_base_to
          , mv.unites
          , mv.ressources
          , mv.type
          , mv.time_depart
          , mv.tps_aller
          , mv.tps_retour
          , mv.tps_fin
          , mv.etat
          , mv.tps_annulation
          , mb.login
          , mb.id
          , b.continent
          , b.region
          , b.secteur
          , mb.race 
     
    FROM mouvements AS mv INNER JOIN membres AS mb 
                          on mb.id in (mv.id_membre_from, mv.id_membre_to) 
                          and '.$infos_membre['id'].' in
                                                       (
                                                        mv.id_membre_from
                                                      , mv.id_membre_to
                                                        ) 
                          and mb.id <> '.$infos_membre['id'].' LEFT JOIN bases AS b 
                                                               ON ((b.id_membre=mb.id && b.id=mv.id_base_from) 
                                                                OR (b.id_membre=mb.id && b.id=mv.id_base_to)) 
    ORDER BY mv.tps_fin
    Cette requete fonctionne parfaitement lorsque mv.id_membre_from et mv.id_membre_to sont différents. Mais lorsque c'est le même (ce qui est possible) alors elle ne prend pas la ligne de la base de donnée.

    J'ai identifié "le problème" qui est ce morceau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     and mb.id <> '.$infos_membre['id'].'
    Seulement quand je le retire alors je me retrouve avec deux ligne dans mon résultat (alors qu'il n'y a que une seule entrée dans la base de donnée !)

    J'aimerais donc faire un compromis entre les deux : que les id des membres soient différents ou pas, je récupère une seule ligne. Et j'ai beau chercher, tester... je ne parviens à aucune solution.

    Merci de votre aide, toujours précieuse

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 849
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 849
    Points : 52 975
    Points
    52 975
    Billets dans le blog
    6
    Par défaut
    Commencez par respecter la charte de postage en indentant votre requête. C'est aussi une marque de politesse !!!

    A +

  3. #3
    Membre confirmé Avatar de chrifo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    444
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 444
    Points : 481
    Points
    481
    Par défaut
    Bonjour,

    Afin de reproduire votre problème et éventuellement de vous proposer une solution, pourriez-vous nous donner :
    - Le SGDB utilisé et sa version
    - Le script de création des tables
    - 1 jeu de données test (les scripts d'insertions c'est encore mieux)
    - Les résultats attendus

    A+

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 65
    Points : 38
    Points
    38
    Par défaut
    @SQLpro : Merci....

    @Chtulus : Vraiment merci.

    @chrifo :
    - MySQL (4-5)
    - Voici la création des tables :

    (Légèrement simplifié)
    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
    CREATE TABLE `bases` (
      `id` int(11) NOT NULL auto_increment,
      `id_membre` int(11) NOT NULL default '0',
      `num_base` int(11) NOT NULL default '0',
      `or` int(11) NOT NULL default '0',
      `bois` int(11) NOT NULL default '0',
      `mana` int(11) NOT NULL default '0',
      ...
      PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;
     
    -- --------------------------------------------------------
     
    -- 
    -- Structure de la table `membres`
    -- 
     
    CREATE TABLE `membres` (
      `id` int(11) NOT NULL auto_increment,
      `login` varchar(20) NOT NULL default '',
      `pass` text NOT NULL,
      `mail` text NOT NULL,
      `sexe` binary(1) NOT NULL default '',
      `race` varchar(20) NOT NULL default '1',
      `confirm` text NOT NULL,
      ...
      PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=8 ;
     
    -- --------------------------------------------------------
     
    -- 
    -- Structure de la table `mouvements`
    -- 
     
    CREATE TABLE `mouvements` (
      `id` int(11) NOT NULL auto_increment,
      `id_membre_from` int(11) NOT NULL default '0',
      `id_membre_to` int(11) NOT NULL default '0',
      `id_base_from` int(11) NOT NULL default '0',
      `id_base_to` int(11) NOT NULL default '0',
      `coordonnees_from` varchar(10) NOT NULL default '',
      `coordonnees_to` varchar(10) NOT NULL default '',
      `unites` text NOT NULL,
      `ressources` text NOT NULL,
      `type` varchar(30) NOT NULL default '',
      `time_depart` int(11) NOT NULL default '0',
      `tps_aller` int(11) NOT NULL default '0',
      `tps_retour` int(11) NOT NULL default '0',
      `tps_fin` int(11) NOT NULL default '0',
      PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;
    Deux insertion différentes pour la table mouvement :
    Cas 1, même id dans source et dans destination :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO `mouvements`
       VALUES (1, 1, 2, 1, 25, 3, 1, 25, 15, 1, 2, 'a:1:{s:6:"unite1";s:1:"5";}', 'a:3:{s:2:"or";s:3:"111";s:4:"bois";s:0:"";s:4:"mana";s:0:"";}', 'transporter', 1, 1225846602, 15204, 18244, 1225880050, 0);
    Cas 2, id de la source et de destination différents ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO `mouvements`
       VALUES (2, 1, 5, 1, 25, 3, 1, 25, 18, 1, 4, 'a:1:{s:6:"unite1";s:1:"5";}', 'a:3:{s:2:"or";s:3:"111";s:4:"bois";s:0:"";s:4:"mana";s:0:"";}', 'transporter', 1, 1225901466, 1456, 1747, 1225904669, 0);
    Un échantillon pour la table membre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO `membres`
       VALUES (1, 'M@x', '...', '...', 0x31, 'orcs', 'a:2:{i:0;a:3:{s:9:"continent";i:1;s:6:"region";i:25;s:7:"secteur";i:3;}i:1;a:3:{s:9:"continent";i:1;s:6:"region";i:25;s:7:"secteur";i:11;}}', 3, 'Nom Alliance', 0, 0, '', 1, 25, 3, 1209092623, 1225901401, 1217024919, 0x30, 'a:9:{s:10:"recherche1";i:14;s:10:"recherche2";i:10;s:10:"recherche3";i:11;s:10:"recherche4";i:7;s:10:"recherche5";i:3;s:10:"recherche6";i:11;s:10:"recherche7";i:10;s:10:"recherche8";i:15;s:10:"recherche9";i:0;}     ', 14, 10, 11, 7, 5, 11, 10, 15, 4, 9140, 543274, 538864);
    Et pour la table base ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO `bases` VALUES (1, 1, 1, 5819385, 3897794, 1887249, 1, 25, 3, 12, 11, 10, 11, 10, 10, 0, 0, 15, 0, 2092, 0, 0, 10025, 1225901466, 1080, 0, 0, 0, 0, 0, 0);

    Maintenant le résultat souhaité :
    Avec la requete, récupérer 1 seul ligne que les id des bases (dans la table mouvement, id_base_from et id_base_to) soient identique ou non.

    Merci beaucoup de ton aide.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 65
    Points : 38
    Points
    38
    Par défaut
    J'ai encore testé de faire mais je n'arrive pas...

    En gros :

    Si id_membre_from et id_membre_to sont identique, ou non alors on prend une fois cette enregistrement.

    Et la requête actuelle -voir mon premier post- ne prend que si les id sont différents.

    Merci à vous,

  6. #6
    Membre confirmé Avatar de chrifo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    444
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 444
    Points : 481
    Points
    481
    Par défaut
    Si j'ai bien compris ta logique, le fait de remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND mb.id <> '.$infos_membre['id'].'
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND (mb.id <> '.$infos_membre['id'].' OR mv.id_membre_from = mv.id_membre_to)
    devrait suffire, non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT [...]
    FROM mouvements AS mv 
    	INNER JOIN membres mb 
            	ON mb.id IN (mv.id_membre_from, mv.id_membre_to) 
                          AND 1 IN (mv.id_membre_from, mv.id_membre_to) 
                          AND (mb.id <> 1 OR mv.id_membre_from = mv.id_membre_to)
    	LEFT JOIN bases b
    		ON b.id_membre=mb.id
    		AND (b.id=mv.id_base_from OR b.id=mv.id_base_to)
    ORDER BY mv.tps_fin
    A+

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 65
    Points : 38
    Points
    38
    Par défaut
    merci de ton aide précieuse. Maintenant je récupère 3 résultats (Alors qu'il n'y a que deux enregistrement dans la base de donnée ^^) Mais je n'arrivais pas si prêt du but (1 ou 4 )

    Donc lorsque mv.id_membre_from et mv.id_membre_to dont identique je récupère l'enregistrement en double. J'aimerais donc si possible ne récupérer que un unique enregistrement pour ce cas.

    (J'ai pensé à le faire en php -vérifier les ids par exemple- mais pour des raisons autres je tente du mieux que possible de le faire directement dans la base de donnée)

    Maxime.

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 65
    Points : 38
    Points
    38
    Par défaut
    Finalement c'était pas si compliqué :

    Voici ce que j'ai fait, merci de m'indiquer si vous avez de meilleurs solutions

    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
    SELECT 
         DISTINCT(mv.id_mouvement),
         mv.id_membre_from,
         mv.id_membre_to,
         mv.id_base_from,
         mv.id_base_to,
         mv.unites,
         mv.ressources,
         mv.type,
         mv.time_depart,
         mv.tps_aller,
         mv.tps_retour,
         mv.tps_fin,
         mv.etat,
         mv.tps_annulation,
         mb.login,
         mb.id,
         b.continent,
         b.region,
         b.secteur,
         mb.race
         FROM mouvements AS mv
             INNER JOIN membres AS mb
                on mb.id
                    in (mv.id_membre_from, mv.id_membre_to) and '.$infos_membre['id'].'
                    in (mv.id_membre_from, mv.id_membre_to) and (mb.id <> '.$infos_membre['id'].' OR mv.id_membre_from = mv.id_membre_to)
             LEFT JOIN bases AS b
                ON ((b.id_membre=mb.id && b.id=mv.id_base_from) OR (b.id_membre=mb.id && b.id=mv.id_base_to))
         GROUP BY mv.id_mouvement
         ORDER BY mv.tps_fin
    Merci en tout cas pour votre aide.

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

Discussions similaires

  1. Modification Requete SQL
    Par rippoz dans le forum Langage SQL
    Réponses: 1
    Dernier message: 13/11/2007, 12h50
  2. modification d'enregistrements d'une requete SQL
    Par Pitou5464 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 12/09/2006, 17h34
  3. [SQL - ORACLE] Requete un peu compliquée (pour moi)
    Par Worldofdada dans le forum Langage SQL
    Réponses: 15
    Dernier message: 03/11/2005, 08h25
  4. modification de la requete SQL d'une liste
    Par legillou dans le forum Access
    Réponses: 2
    Dernier message: 23/06/2005, 08h43
  5. DBNavigator, requete SQL et modif d'un champ
    Par TieumB dans le forum C++Builder
    Réponses: 9
    Dernier message: 27/01/2004, 08h50

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