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écupérer seulement les lignes avec un id commun


Sujet :

MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Septembre 2014
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2014
    Messages : 22
    Par défaut Récupérer seulement les lignes avec un id commun
    Bonjour,

    Je me suis rendu compte que j'ai posté ma demande dans le mauvais forum, je me permets donc de rouvrir une nouvelle discussion dans la bonne section et je m'en excuse.
    Pour mon souci, je ne sais pas si le titre est assez explicite par rapport à ma demande donc je vous expose ma situation.
    J'ai ma table, qu'on peut appelé list_gp, suivante :
     id   ctx_id  gp_nm   bt_id
    15129    8      L1      1
    15128    8      L2      1
    15130    8      L2      2
    15131    8      L1      2
    12960    8      L3      2
    15132    8      L2      3
    15133    8      L1      3
    15135    8      L1      4
    15134    8      L2      4
    12961    8      L3      5
    15136    8      L2      5
    15137    8      L1      5
    
    Ce que je souhaiterai faire, c'est juste lister toutes les lignes qui ont que 2 entrées identiques dans le champ bt_id (ex: pour bt_id=1, bt_id=2) et par la suite rajouter le gp_nm L3 avec le bt_id qui va bien à toutes les entrées (qui auront éventuellement été listées) qui n'en ont pas.

    J'espère être assez précis dans ma demande.
    J'ai réussi à lister ceux qui ont 2 valeurs grâce à un select count et un group by et having mais pas à le faire comme je le voudrai.

    Merci de votre aide.

  2. #2
    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
    Non, ce n'est pas clair !

    Donnez le résultat attendu à partir de vos données exemple.
    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 !

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Septembre 2014
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2014
    Messages : 22
    Par défaut
    J'en étais presque sûr, désolé de la confusion.
    Clairement le résultat attendu est celui-ci :

    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
    id        ctx _id    gp_nm    bt_id
    15129    8          L1          1
    15128    8          L2          1
    12962    8          L3          1
    15130    8          L2          2
    15131    8          L1          2
    12960    8          L3          2
    15132    8          L2          3
    15133    8          L1          3
    12963    8          L3          3
    15135    8          L1          4
    15134    8          L2          4
    12964    8          L3          4
    12961    8          L3          5
    15136    8          L2          5
    15137    8          L1          5
    J'ai fait apparaître en gras et italique les lignes supplémentaires attendues que je souhaite pouvoir obtenir.
    En espérant que cela soit plus parlant.
    Merci

  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
    Si je comprends bien, tu veux ajouter une ligne avec gp_nm = L3 pour tous les bt_id qui ont strictement 2 lignes sans gp_nm = L3.

    1) Liste des bt_id qui ont strictement 2 lignes sans gp_nm = L3 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT ctx_id, bt_id
    FROM list_gp
    WHERE gp_nm <> 'L3'
    GROUP BY ctx_id, bt_id
    HAVING COUNT(*) = 2
    2) Ajout de la ligne avec gp_nm = L3 pour ces lignes, en supposant que id est auto-incrémenté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    INSERT INTO list_gp(id_ctx, bt_id, gp_nm)
    SELECT id_ctx, bt_id, 'L3'
    FROM list_gp
    WHERE gp_nm <> 'L3'
    GROUP BY id_ctx, bt_id
    HAVING COUNT(*) = 2
    Sauvegarder d'abord la BDD, tester le SELECT et vérifier qu'il n'y a bien que les lignes concernés. puis lancer l'INSERT et vérifier le résultat de l'INSERT.
    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
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Septembre 2014
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2014
    Messages : 22
    Par défaut
    De façon beaucoup plus claire, c'est bien ça CinePhil

    J'ai essayé de mon côté, la requête select m'affiche bien mes boutons qui n'ont que 2 bt_id en retournant que la première entrée qu'il trouve.
    Id s'auto incrémente, je n'ai pas de souci à ce niveau là.
    Cependant le insert fonctionne bien, il rajoute bien les lignes pour avoir le gp_nm L3 et tout mais il rajoute également aux entrées qui ont déja L3 du coup ça me fait une duplication. Pour ça, je pense faire une requete s'il trouve une duplication, de m'en supprimer une des deux mais c'est pas très propre.
    Est-il possible de faire un test depuis le insert pour dire si la ligne existe déja, de ne pas la rajouter ?
    Mais ça a quand même pris en compte pour les autres.

    Merci beaucoup de ton 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
    Cependant le insert fonctionne bien, il rajoute bien les lignes pour avoir le gp_nm L3 et tout mais il rajoute également aux entrées qui ont déja L3 du coup ça me fait une duplication
    OK. Il faut ajouter une condition dans la requête. Essaie celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT l1.ctx_id, l1.bt_id
    FROM list_gp l1
    WHERE gp_nm <> 'L3'
    	AND NOT EXISTS (
    		SELECT *
    		FROM list_gp l2
    		WHERE l2.ctx_id = l1.ctx_id
    			AND l2.bt_id = l1.bt_id
    			AND l2.gp_nm = 'L3'
    	)
    GROUP BY l1.ctx_id, l1.bt_id
    HAVING COUNT(*) = 2
    Et donc ensuite pour l'INSERT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    INSERT INTO list_gp(id_ctx, bt_id, gp_nm)
    SELECT l1.ctx_id, l1.bt_id, 'L3'
    FROM list_gp l1
    WHERE gp_nm <> 'L3'
    	AND NOT EXISTS (
    		SELECT *
    		FROM list_gp l2
    		WHERE l2.ctx_id = l1.ctx_id
    			AND l2.bt_id = l1.bt_id
    			AND l2.gp_nm = 'L3'
    	)
    GROUP BY l1.ctx_id, l1.bt_id
    HAVING COUNT(*) = 2
    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. Réponses: 2
    Dernier message: 01/07/2014, 17h14
  2. Seulement les lignes entres 2 expressions ( Avec / )
    Par Ivelios dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 16/04/2013, 17h53
  3. Réponses: 5
    Dernier message: 23/05/2011, 15h50
  4. Réponses: 5
    Dernier message: 24/06/2008, 13h07

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