OVH Cloud OVH Cloud

SELECT MIN

2 réponses
Avatar
bruno
Comment pui-je sélectionner les offres les moins chère pour chaque
article ?

Je dispose d'une table "produits" avec un identifiant "ProdNum" et une
table "articles" dans laquelle je stocke les offres de différents
fournisseurs. Je voudrais ne sélectionner que les offres les moins
chère et connaitre le fournisseur corespondant.

Voici un extrait de la table "articles" :
| ArtNum | ProdNum | FourNum | ArtPrix |
| 1 | 2 | 1 | 12.40 |
| 2 | 2 | 2 | 11.50 |
| 3 | 4 | 1 | 18.00 |
| 4 | 4 | 2 | 56.00 |

Avec FourNum : l'identifiant du fournisseur

Merci pour vos réponses. J'atteinds là les limites de mes capacités en
SQL.
Bruno

2 réponses

Avatar
Seb Hastien
Dans son message précédent, bruno a écrit :
Comment pui-je sélectionner les offres les moins chère pour chaque
article ?

Je dispose d'une table "produits" avec un identifiant "ProdNum" et une
table "articles" dans laquelle je stocke les offres de différents
fournisseurs. Je voudrais ne sélectionner que les offres les moins
chère et connaitre le fournisseur corespondant.

Voici un extrait de la table "articles" :
ArtNum | ProdNum | FourNum | ArtPrix |
1 | 2 | 1 | 12.40 |
2 | 2 | 2 | 11.50 |
3 | 4 | 1 | 18.00 |
4 | 4 | 2 | 56.00 |



Avec FourNum : l'identifiant du fournisseur

Merci pour vos réponses. J'atteinds là les limites de mes capacités en
SQL.
Bruno



Bonjour,

Certains SGBD prévoient ce genre de fonctions mais au vu des messages
précédents il semble que tu utilises MySQL.
Tu peux essayer les requêtes suivantes pour répondre à ta question:

SELECT A.*
FROM
Articles A,
(SELECT ProdNum,min(ArtPrix) as MinPrix
FROM Articles
GROUP BY ProdNum)) T
WHERE
A.ProdNum = T.ProdNum AND
A.ArtPrix = T.MinPrix;

ou

SELECT A1.*
FROM
Articles A1
LEFT OUTER JOIN
Articles A2
ON A1.ProdNum = A2.ProdNum
AND A1.ArtPrix > A2.ArtPrix
WHERE A2.ArtNum IS NULL;

Attention en MySQL 3 les sous-requêtes ne sont pas supportées et la
méthode 1 devra être découpée en 2 avec création d'une table
temporaire.
Attention aussi aux doublons si tu as 2 fournisseurs qui proposent le
même produit au même prix et que celui-ci est le prix minimum, les
requêtes que je t'ai proposées sortiront 2 lignes pour ce produit.

--
Ceci est une signature automatique de MesNews.
Site : http://www.mesnews.net
Avatar
Bruno
In article ,
Seb Hastien wrote:



Bonjour,

Certains SGBD prévoient ce genre de fonctions mais au vu des messages
précédents il semble que tu utilises MySQL.
Tu peux essayer les requêtes suivantes pour répondre à ta question:

SELECT A.*
FROM
Articles A,
(SELECT ProdNum,min(ArtPrix) as MinPrix
FROM Articles
GROUP BY ProdNum)) T
WHERE
A.ProdNum = T.ProdNum AND
A.ArtPrix = T.MinPrix;



Merci
cela fonctionne.
J'avais simplifié le cas de figure pour l'explication du problème, mais
j'avais des jointures à ajouter, ce qui donne ceci :

SELECT A.* FROM Articles A, (SELECT AM.ProdNum,min(ArtPx) as MinPrix
FROM Articles AM, produits as P, gammes as G WHERE AM.ProdNum=P.ProdNum
AND P.GamNum=G.GamNum AND AM.ArtQte>GamQteCrit GROUP BY AM.ProdNum) T
WHERE A.ProdNum=T.ProdNum AND A.ArtPx = T.MinPrix;
ou

SELECT A1.*
FROM
Articles A1
LEFT OUTER JOIN
Articles A2
ON A1.ProdNum = A2.ProdNum
AND A1.ArtPrix > A2.ArtPrix
WHERE A2.ArtNum IS NULL;


Par contre avec les nouvelles jointures je n'arrive pas à ce que je veux
avec ce second exemple.
Tans pis je passe sur MYSQL 4

Attention en MySQL 3 les sous-requêtes ne sont pas supportées et la
méthode 1 devra être découpée en 2 avec création d'une table
temporaire.
Attention aussi aux doublons si tu as 2 fournisseurs qui proposent le
même produit au même prix et que celui-ci est le prix minimum, les
requêtes que je t'ai proposées sortiront 2 lignes pour ce produit.


Pour l'instant, je ne vois pas comment éviter ces doublons.