Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Débuter
Débuter Forum d'entraide pour débuter avec 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 12/11/2011, 15h57   #1
Membre du Club
 
Homme Thierry Rouillon
électronicien
Inscription : octobre 2006
Messages : 74
Détails du profil
Informations personnelles :
Nom : Homme Thierry Rouillon
Âge : 55
Localisation : France

Informations professionnelles :
Activité : électronicien
Secteur : Bâtiment

Informations forums :
Inscription : octobre 2006
Messages : 74
Points : 45
Points : 45
Par défaut 3 requêtes pour 1 résultat

Bonjour. Pour passer une commande; je voudrais sélectionner des fournisseurs `id_fourni` ayant des `pu_ht` le plus petit possible. Je me vois obligé de faire une requète PHP pour obtenir satisfaction. Il me semble impossible de sélectionner directement dans les bl_fournisseurs la meilleur ligne.

Voici la 1ere requête:
J'ai la commande suivante
Code :
1
2
3
4
5
6
7
8
SELECT `id_comman` , `id_stock` , `bl_fournis`.`id_fourni` , `pu_ht`
FROM `bl_fournis`
INNER JOIN `commande`
USING ( `id_stock` )
WHERE `date_bl` > CURDATE( ) - INTERVAL 24
MONTH
ORDER BY `id_stock` , `pu_ht` ASC
LIMIT 0 , 30
qui me retourne

Citation:
id_comman id_stock id_fourni pu_ht
0000003112 0000000001 101 6.95
0000003112 0000000001 101 6.95
0000005102 0000000001 101 6.95
0000005102 0000000001 101 6.95
0000005070 0000000001 101 6.95
0000005070 0000000001 101 6.95
0000005108 0000000002 101 9.35
0000005129 0000000003 052 1.10
0000004910 0000000010 101 0.16
0000005071 0000000010 101 0.16
0000005130 0000000010 101 0.16
0000005071 0000000010 101 0.21
0000005130 0000000010 101 0.21
0000004910 0000000010 101 0.21
0000005113 0000000014 101 0.10
0000005113 0000000014 101 0.11
0000005113 0000000014 101 0.11
0000005141 0000000129 101 8.90
0000005141 0000000129 101 13.32
0000005141 0000000129 101 13.32
0000005141 0000000129 101 14.35
0000005094 0000000134 101
De là je lis la 1ere ligne de chaque article stock qui me donne le meilleur fournisseur en rapport au prix.
Puis par une 2e requete je crée une table temporaire avec mes résultats.

En dernier (3e requete) je génère mon tableau de renouvellement de stock
Y a t-il une solution plus simple ?
J'espère être assez clair. Merci.
LampeRouge est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/11/2011, 11h02   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 029
Points : 18 328
Points : 18 328
Envoyer un message via MSN à CinePhil
Je suppose que tu veux le plus petit prix par id_stock ?

Code :
1
2
3
SELECT id_stock, MIN(pu_ht) AS prix_mini
FROM bl_fournis
GROUP BY id_stock
Ensuite, pour récupérer le ou les fournisseurs qui fournissent le prix pour chaque id_stock, il faut joindre cette requête à la table :
Code :
1
2
3
4
5
6
7
8
9
10
SELECT DISTINCT b.id_stock, b.id_fourni, tmp.prix_mini
FROM bl_fournis b
INNER JOIN 
(
	SELECT id_stock, MIN(pu_ht) AS prix_mini
	FROM bl_fournis
	GROUP BY id_stock
) tmp 
	ON tmp.prix_mini = b.pu_ht
	AND tmp.id_stock = b.id_stock
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/11/2011, 22h00   #3
Membre du Club
 
Homme Thierry Rouillon
électronicien
Inscription : octobre 2006
Messages : 74
Détails du profil
Informations personnelles :
Nom : Homme Thierry Rouillon
Âge : 55
Localisation : France

Informations professionnelles :
Activité : électronicien
Secteur : Bâtiment

Informations forums :
Inscription : octobre 2006
Messages : 74
Points : 45
Points : 45
C'est pas tout à fait ça, mais on s'y rapproche.
En fait dans ma 2e requete je fais :

Code :
1
2
3
4
CREATE TEMPORARY TABLE `prix`
              SELECT `id_stock` ,`id_fourni`,`pu_ht`
              FROM `bl_fournis`
              LIMIT 0,1"
Qui me donne un format de table identique au niveau des champs à `bl_fournis`
Je la vide de son contenu:

J'y integre par du php les lignes sivante:

Citation:
0000003112 0000000001 101 6.95
0000005108 0000000002 101 9.35
0000004910 0000000010 101 0.16
0000005113 0000000014 101 0.10
0000005141 0000000129 101 8.90
Dans ma dernière requete je génère les commandes de la façon suivante:

Code :
1
2
3
4
5
6
7
8
9
10
SELECT `id_comman` ,`qte`,`commande` , `commande`.`date_creat`,`fournisseur`.`nom`,`f2`.`nom`AS `prisé`,
 `genre` , `nom_client`,`type_cde`.`type` 
FROM `commande`
LEFT JOIN `client`          ON  `commande`.`id_client` 	= `client`.`ref_client`
LEFT JOIN `fournisseur`     ON  `commande`.`id_fourni` 	= `fournisseur`.`id`
LEFT JOIN `prix`            ON  `commande`.`id_stock`  	= `prix`.`id_stock`
LEFT JOIN `fournisseur`AS `f2` ON  `prix`.`id_fourni` 	=  `f2`.`id`
LEFT JOIN `type_cde`	    ON  `type_cde`.`id`		=  `id_type`
WHERE `commande`.`historique` != 'T'
AND   `date_fax`    = '0000-00-00'
On a besoin ici d'un nouveau champ qui est le ID_fournisseur.
Dans la requete

Code :
1
2
3
SELECT id_stock, MIN(pu_ht) AS prix_mini
FROM bl_fournis
GROUP BY id_stock
Si je rajoute `id_fourni` ce dernier devient faux car il n'est pas en phase avec MIN(pu_ht)
C'est d'ailleurs ce problème qui m'a amené à faire un truc en 3 étapes.
LampeRouge est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/11/2011, 22h28   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 029
Points : 18 328
Points : 18 328
Envoyer un message via MSN à CinePhil
Soyons clairs :

1) Tu cherches bien le ou les fournisseurs ayant le prix mini pour chaque id_stock ?

2) Pourquoi t'es-tu arrêté à ma première requête, c'est à dire la sous-requête de la seconde ?

3) As-tu essayé ma seconde requête qui répond au besoin que j'ai exprimé en 1) ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/11/2011, 23h36   #5
Membre du Club
 
Homme Thierry Rouillon
électronicien
Inscription : octobre 2006
Messages : 74
Détails du profil
Informations personnelles :
Nom : Homme Thierry Rouillon
Âge : 55
Localisation : France

Informations professionnelles :
Activité : électronicien
Secteur : Bâtiment

Informations forums :
Inscription : octobre 2006
Messages : 74
Points : 45
Points : 45
Ça y est j'y suis arrivé. J'ai eu un peu de mal mais il faut réfléchir un peu.
J'ai beaucoup gagné en réactivité. C'est très agréable. Merci beaucoup.

J'ai encore du boulot pour travailler les requêtes imbriquées.
LampeRouge 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 06h57.


 
 
 
 
Partenaires

Hébergement Web