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

Requêtes MySQL Discussion :

Insert multiples avec sous-requête SELECT


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de lolymeupy
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    402
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2006
    Messages : 402
    Par défaut Insert multiples avec sous-requête SELECT
    Bonjour,
    je cherche à créer une requête pour faire un INSERT multiple.
    Pour être le plus précis possible, voici la table concernée :
    Table : order_history
    Champs :
    id_order_history id_employee id_order id_order_state date_add

    C'est table contient le statut de toutes mes commandes. A chaque fois qu'une commande est changée de statut, un nouvel enregistrement est créé.
    Un exemple valant mieux qu'un long discours, prenons 1 exemple d'enregistrement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    id_order_history 1 
    id_employee      2
    id_order 	      83
    id_order_state   1	
    date_add          2011-08-08 13:46:00
    id_order_history est la clé primaire auto-incrémentée
    id_employee est l'id de l'employé qui change le statut (cette valeur peut rester à "2" tous le temps)
    id_order est l'id de la commande
    id_order_state est l'id correspondant au statut (par exemple :1 = "commande passée", 2 = "livraison en cours", 3 = "livrée", etc...)
    Donc si je change depuis le back-office le statut ("commande passée") de cette commande (id_order=83) au statut ("livraison en cours"), cela va insérer la ligne suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    id_order_history 2 
    id_employee      2
    id_order 	      83
    id_order_state   2
    date_add          2011-08-08 13:48:00
    Et ce que je voudrais c'est trouver la requête qui me permet de passer toutes les commandes (en choisissant la plage des commandes. cad entre id_order >83 et id_order>102 par exemple), dont le statut en cours soit égal à 2 (cad que la valeur de la date_add doit être la valeur MAX pour chaque commande, donc chaque id_order).

    J'espère être suffisamment clair sur ce que je recherche

    N'étant vraiment pas au point sur les sous-requêtes, j'ai vraiment besoin d'aide sur ce coup là...
    Merci beaucoup

  2. #2
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 065
    Par défaut
    Bonjour,

    Ça peut se faire comme ça (mais il existe d'autres solutions) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT oh1.id_order
    FROM order_history oh1
    INNER JOIN order_history oh2 ON oh1.id_order = oh2.id_order
    WHERE oh1.id_order_state = 2
    AND oh1.id_order BETWEEN 83 AND 102
    GROUP BY oh1.id_order, oh1.id_order_state
    HAVING oh1.date_add = MAX(oh2.date_add)
    ORDER BY oh1.id_order;
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  3. #3
    Membre éclairé Avatar de lolymeupy
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    402
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2006
    Messages : 402
    Par défaut
    Merci beaucoup pour ton aide Ced

    Par contre, il me met une erreur :
    #1054 - Unknown column 'oh1.date_add' in 'having clause'
    et pourtant le champ date_add existe bien dans cette table (j'ai testé avec le champ id_employee à la place de date_add dans la clause HAVING, et il me met la même erreur...)

    Sinon, cette requête SELECT est à insérer ensuite en sous-requête dans ma requête INSERT, c'est ça ?

    Merci encore

  4. #4
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 065
    Par défaut
    Oups, c'est de ma faute, j'ai testé sur id_order_state et j'ai recopié la requête sur date_add.
    Essaie comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT oh1.id_order
    FROM order_history oh1
    INNER JOIN order_history oh2 ON oh1.id_order = oh2.id_order
    WHERE oh1.id_order_state = 2
    AND oh1.id_order BETWEEN 83 AND 102
    GROUP BY oh1.id_order, oh1.date_add
    HAVING oh1.date_add = MAX(oh2.date_add)
    ORDER BY oh1.id_order;
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  5. #5
    Membre éclairé Avatar de lolymeupy
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    402
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2006
    Messages : 402
    Par défaut
    C'est nickel
    Merci beaucoup Ced

    Et pour faire les INSERT ensuite, j'inclus ce SELECT en sous-requête, c'est ça ?
    Est-ce que c'est possible de faire un INSERT multiples à partir d'une seule requête ( cad sans passer par une boucle) ?

  6. #6
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 065
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

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

Discussions similaires

  1. Insertions multiples avec VALUES et SELECT
    Par Madfrix dans le forum Requêtes
    Réponses: 2
    Dernier message: 17/02/2011, 12h55
  2. insertion avec sous requête et ON DUPLICATE KEY
    Par epeichette dans le forum Requêtes
    Réponses: 5
    Dernier message: 05/10/2009, 15h14
  3. Insertion à base de sous requête select
    Par imane_bennouna dans le forum Langage SQL
    Réponses: 2
    Dernier message: 25/07/2006, 12h03
  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. Insertion multiple à base de sous requête SELECT
    Par drinkmilk dans le forum Langage SQL
    Réponses: 8
    Dernier message: 14/04/2005, 16h34

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