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 21/06/2011, 12h24   #1
Invité régulier
 
Homme Christophe
Inscription : mars 2011
Messages : 22
Détails du profil
Informations personnelles :
Nom : Homme Christophe

Informations forums :
Inscription : mars 2011
Messages : 22
Points : 5
Points : 5
Par défaut Jointure et Distinct

Bonjour à tous et à toutes,

J'ai un petit problème de requête, j'ai 2 tables : une qui affiche le code et libellé du produit et l'autre qui affiche différents prix suivant une date pour un code produit.

J'essaye en vain de faire une jointure me permettant d'afficher le dernier prix de l'article.

voici ma requête :
Code :
1
2
3
4
5
SELECT p.CODE_PRODUIT, p.LIBELLE_PRODUIT, MAX(pr.DATE_PRIX), pr.PRIX_KILO, pr.CODE_PRIX
FROM produit AS p
INNER JOIN prix AS pr ON pr.CODE_PRODUIT = p.CODE_PRODUIT
GROUP BY CODE_PRODUIT 
ORDER BY CODE_PRODUIT
L'erreur de cette requête est qu'elle m'affiche bien 1 seul code produit avec la date_Prix la plus récente, mais elle m'affiche le prix qui correspond à une autre date...
j'ai essayé avec distinct mais ça change rien.

Savez vous comment je peux changer la requête pour avoir le résultat non corrompu ? Voyez-vous une erreur dans ma requête?

Merci par avance.
Nnahaa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2011, 12h58   #2
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 530
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

Informations professionnelles :
Activité : Retraité
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : novembre 2005
Messages : 2 530
Points : 3 523
Points : 3 523
Saluton,
C'est un problème poser ici de façon récurrente.
Il faut t'inspirer de cette source.
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
articles : Comment émuler un tableau croisé [quasi] dynamique
et : Une énigme mathématique résolue avec MySQL
recommande l'utilisation de PDO (PHP5 Data Objects)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 21/06/2011, 12h58   #3
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 440
Points : 6 440
Bonjour,

C'est une question souvent posée...
Essaie avec la requête suivante :
Code :
1
2
3
4
5
6
SELECT p.CODE_PRODUIT, p.LIBELLE_PRODUIT, pr1.PRIX_KILO, pr1.CODE_PRIX
FROM produit AS p
INNER JOIN prix AS pr1 ON pr1.CODE_PRODUIT = p.CODE_PRODUIT
INNER JOIN prix AS pr2 ON pr2.CODE_PRODUIT = pr1.CODE_PRODUIT
GROUP BY p.CODE_PRODUIT, p.LIBELLE_PRODUIT, pr1.PRIX_KILO, pr1.CODE_PRIX
HAVING pr1.DATE_PRIX = MAX(pr2.DATE_PRIX)
A tester, c'est écrit sans aucune vérification...

Une autre façon de faire serait d'adapter la requête présentée dans les codes sources MySQL : http://mysql.developpez.com/telechar...aque-categorie

[EDIT] Argh, grillé en rapidité de réponse
__________________
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 10
Vieux 21/06/2011, 13h37   #4
Invité régulier
 
Homme Christophe
Inscription : mars 2011
Messages : 22
Détails du profil
Informations personnelles :
Nom : Homme Christophe

Informations forums :
Inscription : mars 2011
Messages : 22
Points : 5
Points : 5
Un grand merci à vous 2.

Cela fait un moment que je cherche et j'étais vraiment en peine.
Je n'avais pas trouvé la source de ton lien.

Donc j'ai utilisé le lien de ta source et j'ai modifié ma requete comme ceci :

Code :
1
2
3
4
5
6
7
8
9
10
11
SELECT
p.CODE_PRODUIT, p.LIBELLE_PRODUIT, pr.DATE_PRIX,pr.PRIX_KILO, pr.CODE_PRIX
FROM produit p
INNER JOIN
prix pr ON p.CODE_PRODUIT = pr.CODE_PRODUIT
WHERE (
SELECT COUNT(*)
FROM prix p1
WHERE p1.CODE_PRODUIT = pr.CODE_PRODUIT
AND p1.DATE_PRIX > pr.DATE_PRIX
) < 1
la requête me renvoit le bon prix de chaque produit, c'est parfait.

encore merci à vous, vous m'avez bien débloqué.

<edit> pour Ced j'ai testé ta méthode, elle fonctionne également mais j'ai du rajouter pr1.DATE_PRIX sur le premier select sinon j'avais une erreur mysql

Code :
1
2
3
4
5
6
SELECT p.CODE_PRODUIT, p.LIBELLE_PRODUIT, pr1.PRIX_KILO, pr1.CODE_PRIX, pr1.DATE_PRIX
FROM produit AS p
INNER JOIN prix AS pr1 ON pr1.CODE_PRODUIT = p.CODE_PRODUIT
INNER JOIN prix AS pr2 ON pr2.CODE_PRODUIT = pr1.CODE_PRODUIT
GROUP BY p.CODE_PRODUIT, p.LIBELLE_PRODUIT, pr1.PRIX_KILO, pr1.CODE_PRIX
HAVING pr1.DATE_PRIX = MAX(pr2.DATE_PRIX)
Nnahaa 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 22h47.


 
 
 
 
Partenaires

Hébergement Web