Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Aux spécialialistes SQL

22 réponses
Avatar
I.G.LOG
Bonjour à tous,
Je travaille avec MySQL 4.1 et Windev 12 56c ; mais ce problème est sur le
SQL:

J'ai trois tables FOURNISSEUR (1,1), COMMANDE (0,n) et LIGNECDE (0,n)

Dans LIGNECDE, j'ai un identifiant article.
Pour un article donné, je voudrai récupérer la ligne correspondant à la
dernière commande de chaque fournisseur !
J'avoue ne pas savoir comment mettre ça en place.

Merci pour votre aide

10 réponses

1 2 3
Avatar
Roumégou Eric
I.G.LOG a pensé très fort :
Bonjour à tous,
Je travaille avec MySQL 4.1 et Windev 12 56c ; mais ce problème est sur le
SQL:

J'ai trois tables FOURNISSEUR (1,1), COMMANDE (0,n) et LIGNECDE (0,n)

Dans LIGNECDE, j'ai un identifiant article.
Pour un article donné, je voudrai récupérer la ligne correspondant à la
dernière commande de chaque fournisseur !
J'avoue ne pas savoir comment mettre ça en place.

Merci pour votre aide



order by desc et limit 1

--
Eric Roumégou
Webmaster des wtablettes
http://cerbermail.com/?qE7t4Qvilo
(cliquez sur le lien ci-dessus pour me contacter en privé)
Avatar
I.G.LOG
"Roumégou Eric" a écrit dans le message de news:

I.G.LOG a pensé très fort :
Bonjour à tous,
Je travaille avec MySQL 4.1 et Windev 12 56c ; mais ce problème est sur
le SQL:

J'ai trois tables FOURNISSEUR (1,1), COMMANDE (0,n) et LIGNECDE (0,n)

Dans LIGNECDE, j'ai un identifiant article.
Pour un article donné, je voudrai récupérer la ligne correspondant à la
dernière commande de chaque fournisseur !
J'avoue ne pas savoir comment mettre ça en place.

Merci pour votre aide



order by desc et limit 1




Bonjour,
J'ai du mal m'exprimer !
J'ai besoin de connaître les derniers prix de commande pour un article, et
ce pour chaque fournisseur à qui j'ai passé une commande.
Si l'article "BALON" a été commandé à "LA DEROUTE", "FNAK", "SPORT 2010", je
voudrais avoir le résultat:

BALON - LA DEROUTE - prix 120
BALON - FNAK - prix 130
BALON - SPORT 2010 - prix 135

"order by desc et limit 1" va me retourner seulement la dernière de la
dernière commande !!!

encore merci
Avatar
free
J'ai pas la solution miracle mais je vois bien truc genre :
a) trouver les derniers ventes, genre :
select idfournisseur,max(date_commande) from commande group by
idfournisseur
b) chercher les tarifs correspondant
en faisant une jointure ou une subquery entre
commande et la requete précédante
(et la j'ai pas la syntaxe)

"I.G.LOG" a écrit dans le message de
news:4a9d3419$0$23459$
Bonjour à tous,
Je travaille avec MySQL 4.1 et Windev 12 56c ; mais ce problème est sur le
SQL:

J'ai trois tables FOURNISSEUR (1,1), COMMANDE (0,n) et LIGNECDE (0,n)

Dans LIGNECDE, j'ai un identifiant article.
Pour un article donné, je voudrai récupérer la ligne correspondant à la
dernière commande de chaque fournisseur !
J'avoue ne pas savoir comment mettre ça en place.

Merci pour votre aide




Avatar
Roumégou Eric
Dans son message précédent, I.G.LOG a écrit :
"Roumégou Eric" a écrit dans le message de news:

I.G.LOG a pensé très fort :
Bonjour à tous,
Je travaille avec MySQL 4.1 et Windev 12 56c ; mais ce problème est sur le
SQL:

J'ai trois tables FOURNISSEUR (1,1), COMMANDE (0,n) et LIGNECDE (0,n)

Dans LIGNECDE, j'ai un identifiant article.
Pour un article donné, je voudrai récupérer la ligne correspondant à la
dernière commande de chaque fournisseur !
J'avoue ne pas savoir comment mettre ça en place.

Merci pour votre aide



order by desc et limit 1




Bonjour,
J'ai du mal m'exprimer !
J'ai besoin de connaître les derniers prix de commande pour un article, et ce
pour chaque fournisseur à qui j'ai passé une commande.
Si l'article "BALON" a été commandé à "LA DEROUTE", "FNAK", "SPORT 2010", je
voudrais avoir le résultat:

BALON - LA DEROUTE - prix 120
BALON - FNAK - prix 130
BALON - SPORT 2010 - prix 135

"order by desc et limit 1" va me retourner seulement la dernière de la
dernière commande !!!

encore merci



franchement pas la tête à me la casser ce soir ;-)
mais je te recopie un fil où j'avais besoin un peu de ce genre de truc
(correspondnces de Premier ou Dernier d'accès)
donc ça peut te donner une idée
==================================================== Roumégou Eric avait énoncé :

Bonjour,
20mn que je tourne là dessus sans trouver
J'ai une table people_vote où je retrouve les enchères par individus
A chaque enchère, la personne peux désactiver le suivi relance mails
(people_vote=0)

J'ai besoin de retrouver la liste les id des personnes dont la dernière
enchère mentionnait pas de suivi (pour les exclure avec un not in)

select ppl_id,coalesce(vot_suivi,1)AS SUIVI,vot_datetime from
people_vote where people_vote.vot_groupe='DR30Q1'
and GFA_IDd and VOT_TYPE='ENCH'
group by ppl_id
having SUIVI=0
order by ppl_id,vot_datetime desc

GFA_IDd permet de tester l'enchère particulière.
vot_groupe identifie les personnes en lice sur cette enchère.

Mon pb est que le group by agit sur la 1ere ligne et le vot_suivi
retourné (et testé en having) correspond à cette 1ere ligne mème si je
joue sur le order by.

En fait il me faudrait une fn Dernier (cela existait en Access) mais je
ne trouve pas en mysql.

Je vais surement coder à la main mais j'aimerais savoir s'il y a une
soluce pure sql.

Merci de vos réponses.

pff !! m'aura donné du fil a retordre celle là !
En fait il faut faire une requete sur une requete


select ppl_id,suivi from(
select ppl_id AS PPL_ID,coalesce(vot_suivi,1)AS SUIVI from people_vote
where people_vote.vot_groupe='DR30Q1'
and GFA_IDd and VOT_TYPE='ENCH'
order by ppl_id,vot_datetime desc
) as id
group by ppl_id
having suivi=0

--
Eric Roumégou
Webmaster des wtablettes
http://cerbermail.com/?qE7t4Qvilo
(cliquez sur le lien ci-dessus pour me contacter en privé)
Avatar
I.G.LOG
"free" a écrit dans le message de news:
4a9d4b8e$0$741$
J'ai pas la solution miracle mais je vois bien truc genre :
a) trouver les derniers ventes, genre :
select idfournisseur,max(date_commande) from commande group by
idfournisseur
b) chercher les tarifs correspondant
en faisant une jointure ou une subquery entre
commande et la requete précédante
(et la j'ai pas la syntaxe)




je cherche avec cette piste à laquelle j'avais pensé intuitivement mais sans
pervenir à formaliser. Si je trouve une solution "efficace" je la
communique.
Merci pour ta réponse
Avatar
I.G.LOG
> J'ai besoin de retrouver la liste les id des personnes dont la dernière
enchère mentionnait pas de suivi (pour les exclure avec un not in)




ca ressemble à mon problème effectivement !

...


pff !! m'aura donné du fil a retordre celle là !
En fait il faut faire une requete sur une requete


select ppl_id,suivi from(
select ppl_id AS PPL_ID,coalesce(vot_suivi,1)AS SUIVI from people_vote
where people_vote.vot_groupe='DR30Q1'
and GFA_IDd and VOT_TYPE='ENCH'
order by ppl_id,vot_datetime desc
) as id
group by ppl_id
having suivi=0

--



je vais creuser ça !
Merci de ta réponse, si je trouve la solution je te la communique.
Bon dev.
Avatar
Firetox
Bonjour,

il faut une requete qui donne les ligne de commande avec les produit classé
par fournisseur,date desc
cette requete sera la table qui permettra de faire le selectr avec group by

en fait le group by groupe sur la premiere ligne et enleve les identique ou
fait des calcul si il y a des aggregats mais sans aggregats c'est comme si
le group by enlevait toutes les lignes suivantes qui sont identique (sur la
formule du group by) ex si j'ai

AAAA 209
AAAA 208
BBBBB 208
BBBBB 206

si je fait un select de ca sur le code j'ai
AAAA 209
BBBB 208

donc il suffit d'avoir le resultat dans l'odre voulu avant le group by et
une sous requete le permet

dans ton cas

SELECT commande.IDFour,ligneCommande.IDproduit,ligneCommande.Prix
FROM Commande
LEFT JOIN ligneCommande ON ligneCommande.IDcommande=commande.IDCommande
ORDER By Commande.IDfournisseur ASC ,ligneCommande.IDProduit ASC ,
commande.dateCommande DESC

cette requete va donner toutes les commandes classée par fournisseur , par
produit et par date la derniere commande passée en premier

ensuite on utilise cette requte comme une table

SELECT
TMPtable.IDFour,TMPTable.IDProduit,TMPTable.Prix
FROM
(
SELECT commande.IDFour as IDFour ,ligneCommande.IDproduit as IDProduit
,ligneCommande.Prix as PRIX
FROM Commande
LEFT JOIN ligneCommande ON ligneCommande.IDcommande=commande.IDCommande
ORDER By Commande.IDfournisseur ASC ,ligneCommande.IDProduit ASC ,
commande.dateCommande DESC
) as TMPtable

GROUP BY IDFOUR,IDProduit

voila cela aura pour effet de ne garder qu'une ligne par fournisseur pour un
produit et comme la sous requete qui nous sert de table a pour un four, un
produit la derniere commande passée en premier le group by fait
l'elimination

voila

Bon dev
@+


"I.G.LOG" a écrit dans le message de
news:4a9d3419$0$23459$
Bonjour à tous,
Je travaille avec MySQL 4.1 et Windev 12 56c ; mais ce problème est sur le
SQL:

J'ai trois tables FOURNISSEUR (1,1), COMMANDE (0,n) et LIGNECDE (0,n)

Dans LIGNECDE, j'ai un identifiant article.
Pour un article donné, je voudrai récupérer la ligne correspondant à la
dernière commande de chaque fournisseur !
J'avoue ne pas savoir comment mettre ça en place.

Merci pour votre aide



Avatar
I.G.LOG
...

SELECT commande.IDFour,ligneCommande.IDproduit,ligneCommande.Prix
FROM Commande
LEFT JOIN ligneCommande ON ligneCommande.IDcommande=commande.IDCommande
ORDER By Commande.IDfournisseur ASC ,ligneCommande.IDProduit ASC ,
commande.dateCommande DESC

cette requete va donner toutes les commandes classée par fournisseur , par
produit et par date la derniere commande passée en premier

ensuite on utilise cette requte comme une table

SELECT
TMPtable.IDFour,TMPTable.IDProduit,TMPTable.Prix
FROM
(
SELECT commande.IDFour as IDFour ,ligneCommande.IDproduit as IDProduit
,ligneCommande.Prix as PRIX
FROM Commande
LEFT JOIN ligneCommande ON ligneCommande.IDcommande=commande.IDCommande
ORDER By Commande.IDfournisseur ASC ,ligneCommande.IDProduit ASC ,
commande.dateCommande DESC
) as TMPtable

GROUP BY IDFOUR,IDProduit



...

Bonjour Firetox,

Oui, ca donne bien ce que je recherche !
Ce concept de GROUP BY est décidemment d'une compréhension peu aisée: dans
ce cas, il retourne la première ligne de chaque groupe "IDFOUR,IDPRODUIT" ?!
(c'est bien ça, sinon je n'aurais pas le PRIX)...
En tous cas la requète fonctionne et retourne bien ce que je cherche.
Une nouvelle fois un grand merci !!
Phil
Avatar
Jerome PAULIN
Bonjour,

Il me semble que le comportement du GROUP BY utilisé ici est spécifique
à MySQL et pourrait bien être différent sur une autre base de données (à
prendre en compte dans le cas où tu t'intéresse à autre chose que MySQL)...

GG
Avatar
Firetox
Bonjour,

non le group by fonctionne comme cela
par contre sous certain SGBD tu ne peux pas faire apparaitre une colonne qui
n'est pas dans le group by sans fonction d'aggregat et donc cette requete
sous SQLServer ne fonctionnera pas par contre en ajoutant un max sur date tu
pourrais avoir la meme chose

Bon dev
@+

Firetox

"Jerome PAULIN" a écrit dans le message de
news:h7ld59$e84$
Bonjour,

Il me semble que le comportement du GROUP BY utilisé ici est spécifique à
MySQL et pourrait bien être différent sur une autre base de données (à
prendre en compte dans le cas où tu t'intéresse à autre chose que
MySQL)...

GG


1 2 3