Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 08/08/2011, 14h05   #1
Membre habitué
 
Avatar de lolymeupy
 
Inscription : octobre 2006
Messages : 329
Détails du profil
Informations personnelles :
Âge : 36
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : octobre 2006
Messages : 329
Points : 106
Points : 106
Envoyer un message via MSN à lolymeupy
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 :
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 :
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
lolymeupy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2011, 14h22   #2
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 437
Points : 6 437
Bonjour,

Ça peut se faire comme ça (mais il existe d'autres solutions) :
Code :
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
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2011, 16h21   #3
Membre habitué
 
Avatar de lolymeupy
 
Inscription : octobre 2006
Messages : 329
Détails du profil
Informations personnelles :
Âge : 36
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : octobre 2006
Messages : 329
Points : 106
Points : 106
Envoyer un message via MSN à lolymeupy
Merci beaucoup pour ton aide Ced

Par contre, il me met une erreur :
Citation:
#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
lolymeupy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2011, 16h29   #4
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 437
Points : 6 437
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 :
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
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2011, 16h45   #5
Membre habitué
 
Avatar de lolymeupy
 
Inscription : octobre 2006
Messages : 329
Détails du profil
Informations personnelles :
Âge : 36
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : octobre 2006
Messages : 329
Points : 106
Points : 106
Envoyer un message via MSN à lolymeupy
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) ?
lolymeupy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2011, 17h12   #6
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 437
Points : 6 437
C'est dans la FAQ : http://mysql.developpez.com/faq/?pag...ertion_requete
__________________
Rédacteur / Modérateur SGBD
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/08/2011, 17h57   #7
Membre habitué
 
Avatar de lolymeupy
 
Inscription : octobre 2006
Messages : 329
Détails du profil
Informations personnelles :
Âge : 36
Localisation : France, Ille et Vilaine (Bretagne)

Informations forums :
Inscription : octobre 2006
Messages : 329
Points : 106
Points : 106
Envoyer un message via MSN à lolymeupy
Oups
J'avais jeté un oeil, mais je cherchais de l'INSERT multiple donc je suis passé au travers...
Je te remercie beaucoup.
Par contre, je voyais pas trop comment insérer des valeurs "fixes", donc j'ai testé et c'est ok comme ça :
Citation:
INSERT INTO order_history( id_employee, id_order, id_order_state, date_add )
SELECT 2 , oh1.id_order, 5, NOW( )
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
Donc merci encore pour ton aide Ced
lolymeupy est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h56.


 
 
 
 
Partenaires

Hébergement Web