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 :

insertion en boucle de valeurs issues d'un select [MySQL-8.0]


Sujet :

MySQL

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    débutant
    Inscrit en
    Mai 2016
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : débutant

    Informations forums :
    Inscription : Mai 2016
    Messages : 56
    Points : 36
    Points
    36
    Par défaut insertion en boucle de valeurs issues d'un select
    Re bonjour à tous,
    me voici devant une nouvelle difficulté : insérer des valeurs issues d'un select distinct
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    BEGIN
    	DECLARE i INT;
    	SET i=1;
    WHILE i <= (SELECT COUNT(*) FROM(SELECT DISTINCT ...) as nombre)
    DO
        INSERT INTO table1 (`champ1`,`champ2`,`champ3`)
        VALUES	(val1,val2,(SELECT DISTINCT ...WHERE ROWNUM=i)) ;
        SET i = i +1;
    END WHILE;
    END
    val1 et val2 ont chacun une valeur unique, mais pour `champ3` mon SELECT DISTINCT ... retourne une série variable de valeurs différentes
    de plus ROWNUM ne semble pas reconu par MySQL

    le résultat que je cherche à obtenir serait avec par exemple i=3
    table1
    champ1 champ2 champ3
    val1 val2 trompette
    val1 val2 clarinette
    val1 val2 hautbois

    par avance merci de vos indications
    cordialement, js

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 104
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 104
    Points : 8 224
    Points
    8 224
    Billets dans le blog
    17
    Par défaut
    Rien compris et la procédure stockée me semble inutile.

    Donne la structure de tes tables, un jeu de données et le résultat attendu à partir de celui-ci.
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    débutant
    Inscrit en
    Mai 2016
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : débutant

    Informations forums :
    Inscription : Mai 2016
    Messages : 56
    Points : 36
    Points
    36
    Par défaut
    merci de t'intéresser au sujet,
    c'est plus moi qui ne suis pas clair.

    je veux INSERT INTO table1 le résultat d'un SELECT DISTINCT via une procédure stockée avec rappel des paramètres que sont val1 et val2.

    mon SELECT DISTINCT (qui est très long de plusieurs tables avec jointures) fonctionne, il me retourne une ou plusieurs lignes selon les paramètres val1 et val2

    table1 comporte une dizaine de colonnes, et je m'intéresse à trois d'entre elles, disons champ1, champ2 et champ3

    val1 doit être insérée dans champ1, disons que champ1=orchestre et val1='Les joyeux lurons'
    val2 dans champ2, disons champ2=formation et val2='vent'
    et val3=résultat du SELECT DISTINCT soit 3 lignes : 1ère ligne trompette, 2ème clarinette, 3ème hautbois, le tout dans dans champ3, disons champ3=instrument


    le résultat de ma procédure stockée serait, pour reprendre l'exemple


    table1
    orchestre formation instrument
    Les joy... vent trompette
    Les joy... vent clarinette
    Les joy... vent hautbois

  4. #4
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 104
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 104
    Points : 8 224
    Points
    8 224
    Billets dans le blog
    17
    Par défaut
    J'ai l'impression que tu veux faire un produit cartésien, mais, désolé, je ne comprends pas.

    Donne un extrait de table1 avant et de table1 après l'insertion.
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    débutant
    Inscrit en
    Mai 2016
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : débutant

    Informations forums :
    Inscription : Mai 2016
    Messages : 56
    Points : 36
    Points
    36
    Par défaut
    peut être, je ne sais pas ce qu'est un produit cartésien

    AVANT INSERT

    table1 est vide
    table1
    orchestre formation instrument


    mon CALL "SELECT DISTINCT..." (var1='Les Joyeux Lurons',var2='vent') retourne 3 lignes:
    trompette
    clarinette
    hautbois

    je cherche à faire un INSERT INTO table1 qui donnera

    APRES INSERT

    table1
    orchestre formation instrument
    Les joy... vent trompette
    Les joy... vent clarinette
    Les joy... vent hautbois

    c'est peut être plus clair ainsi

  6. #6
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 104
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 104
    Points : 8 224
    Points
    8 224
    Billets dans le blog
    17
    Par défaut
    C'est bien ça, c'est un produit cartésien => Il faut utiliser CROSS JOIN

    Ce dernier consiste à sortir toutes les combinaisons des opérandes.

    Pour toi :
    Opérande 1 : ["Les joyeux Lurons"]
    Opérande 2 : [["vent", "trompette"], ["vent", "clarinette"], ["vent", "hautbois"]]

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    INSERT INTO table1 (col1, col2, instrument)
    SELECT ALL 'Les joyeux Lurons', i.var2, i.instrument
    CROSS JOIN (
        SELECT DISTINCT var2, instrument
        FROM ...
        WHERE var2 = 'vent'
    ) AS i
    Résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Les joyeux Lurons	vent	trompette
    Les joyeux Lurons	vent	clarinette
    Les joyeux Lurons	vent	hautbois
    J'espère que tu te rends bien compte que ce n'est pas simple avec tous les mystères que tu fais, et qu'il faudra adapter ma proposition en conséquence
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  7. #7
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Pourquoi vouloir créer une table avec ces redondances ?
    On peut tout à fait restituer le résultat par requête, éventuellement au moyen d'une vue, sans pour autant le stocker dans une table.

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    débutant
    Inscrit en
    Mai 2016
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : débutant

    Informations forums :
    Inscription : Mai 2016
    Messages : 56
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par Séb. Voir le message
    C'est bien ça, c'est un produit cartésien => Il faut utiliser CROSS JOIN
    merci Séb.
    je comprends (enfin, mais encore avec un peu de mal) ce qu'est un produit cartésien

    j'ai peut-être bien fait de ne pas noyer ma question dans une douzaine de tables

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    débutant
    Inscrit en
    Mai 2016
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : débutant

    Informations forums :
    Inscription : Mai 2016
    Messages : 56
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Pourquoi vouloir créer une table avec ces redondances ?
    Bonjour escartefigue,
    table1 doit conserver l'historique du SELECT DISTINCT

  10. #10
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Si j'ai bien compris, il suffit d'ajouter val1 et val2 dans le SELECT qui fonctionne et de faire un INSERT INTO SELECT :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO table1 (`champ1`,`champ2`,`champ3`)
    SELECT DISTINCT val1,val2, val3 from la_requête_qui_marche ...

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    débutant
    Inscrit en
    Mai 2016
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : débutant

    Informations forums :
    Inscription : Mai 2016
    Messages : 56
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par Séb. Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    INSERT INTO table1 (col1, col2, instrument)
    SELECT ALL 'Les joyeux Lurons', i.var2, i.instrument
    CROSS JOIN (
        SELECT DISTINCT var2, instrument
        FROM ...
        WHERE var2 = 'vent'
    ) AS i
    Résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Les joyeux Lurons	vent	trompette
    Les joyeux Lurons	vent	clarinette
    Les joyeux Lurons	vent	hautbois
    re,

    je suis devant un blocage

    mysql retourne
    #1064 - Erreur de syntaxe près de 'CROSS JOIN (
    SELECT DISTINCT var2, instrument
    FROM
    (SELECT DISTINCT pe' à la ligne 3

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    débutant
    Inscrit en
    Mai 2016
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : débutant

    Informations forums :
    Inscription : Mai 2016
    Messages : 56
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par skuatamad Voir le message
    Si j'ai bien compris, il suffit d'ajouter val1 et val2 dans le SELECT qui fonctionne et de faire un INSERT INTO SELECT :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO table1 (`champ1`,`champ2`,`champ3`)
    SELECT DISTINCT val1,val2, val3 from la_requête_qui_marche ...
    Bonjour skuatamad,
    merci de ton attention

    val1 et val2 sont des valeurs uniques qui entrent en paramètres IN
    val3 contient 3 valeurs distinctes

  13. #13
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Je ne pense pas que CROSS JOIN soit nécessaire, il faut juste rajouter val1 et val2 dans la requête qui fonctionne, et faire un INSERT INTO SELECT

  14. #14
    Nouveau membre du Club
    Homme Profil pro
    débutant
    Inscrit en
    Mai 2016
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : débutant

    Informations forums :
    Inscription : Mai 2016
    Messages : 56
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par skuatamad Voir le message
    il faut juste rajouter val1 et val2 dans la requête qui fonctionne
    oui c'est ce qui se passe, val1 et val2 sont 2 paramètres de mon "SELECT DISTINCT..." = la requête qui fonctionne

    en attendant j'ai trouvé une solution "de très mauvais bricoleur" qui a le mérite de fonctionner en suivant la piste de mon premier post avec ROW_NUMBER (dont j'ai trouvé la syntaxe) combiné à une table intermédiaire `pont`:
    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
     
    BEGIN
    DECLARE i INT;
    SET i=1;
     
    IF EXISTS (SELECT `...` FROM ...) 
    THEN
    	DROP TABLE IF EXISTS `pont`;
    	CREATE TABLE IF NOT EXISTS `pont`AS
    	(
    		SELECT DISTINCT ...,ROW_NUMBER() OVER w AS 'numrow'
    		FROM
    			(
        		SELECT DISTINCT ...,
    			FROM  ...) AS v
    		WINDOW w AS (ORDER BY nom)
    	);
     
    	WHILE i <= (SELECT COUNT(*) FROM `pont`)
    	DO
    		INSERT INTO table1(...)
        	VALUES	(...,(SELECT `...` FROM `pont` WHERE `numrow`=i),(SELECT `...` FROM `pont` WHERE `numrow`=i),(SELECT `...` FROM `pont` WHERE `numrow`=i));
        	SET i = i +1;
    	END WHILE;
    	DROP TABLE `pont`;
     
    ELSE 
    	select '... ';
    END IF;
    END
    en attendant de trouver mieux

  15. #15
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Est ce que vous comprenez ce que fait INSERT INTO SELECT ?

    Ça permet d'insérer le résultat du SELECT dans la table ! => C'est exactement votre besoin tel que vous le décrivez.

    Il n'y a absolument pas besoin de boucle avec du INSERT INTO VALUES, ou alors vous n'avez pas bien décrit votre problème en le simplifiant pour le présenter.

  16. #16
    Nouveau membre du Club
    Homme Profil pro
    débutant
    Inscrit en
    Mai 2016
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : débutant

    Informations forums :
    Inscription : Mai 2016
    Messages : 56
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par skuatamad Voir le message
    Est ce que vous comprenez ce que fait INSERT INTO SELECT ?
    bonsoir skuatamad,
    cette combinaison est nouvelle pour moi, je vais essayer
    merci

  17. #17
    Nouveau membre du Club
    Homme Profil pro
    débutant
    Inscrit en
    Mai 2016
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : débutant

    Informations forums :
    Inscription : Mai 2016
    Messages : 56
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par skuatamad Voir le message
    Est ce que vous comprenez ce que fait INSERT INTO SELECT ?
    Bonsoir Kuatamad, Séb, Escartefigue,

    j'ai trouvé une solution satisfaisante avec INSERT INTO SELECT et les jointures "qui marchent", le CROSS JOIN me renvoyait trop de lignes dont certaines n'avaient aucun intérêt, merci de vos éclairages.
    codialement js

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 24/05/2022, 12h51
  2. [MySQL] Somme de valeurs issues d'une boucle.
    Par ripout dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 15/11/2010, 18h04
  3. Réponses: 2
    Dernier message: 23/06/2010, 17h14
  4. Requête d'insertion multiple avec 1 valeur fixe
    Par [DreaMs] dans le forum Langage SQL
    Réponses: 2
    Dernier message: 01/12/2005, 09h28
  5. INSERT INTO avec une valeur numéroauto
    Par priest69 dans le forum Requêtes et SQL.
    Réponses: 12
    Dernier message: 08/11/2005, 15h39

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