Page 1 sur 1

besoin de faire un ORDER BY avant un GROUP BY

Posté : 08 sept. 2005, 17:06
par trax
bonjour,

je merdouille sur une requete mysql...

j'ai une table d'un produit X, distribué ds Y endroit, dont je souhaiterai suivre l'evolution du prix... en mettant en priorité la date du dernier enregistrment... de manière a voir les prix les plus recent. et après, trier par prix...

histoire de ne pas avoir une prix datant de plusieurs mois, donc certainement plus à jour...

voici la table :

+----+-----------+------------+-------+
| id | idshop | date | prix |
+--+---------+--------------+-------+
| 1 | 1 | 2005-09-03 | 10.00 |
| 2 | 2 | 2005-09-07 | 11.50 |
| 3 | 3 | 2005-09-06 | 10.30 |
| 4 | 4 | 2005-09-07 | 11.90 |
| 5 | 1 | 2005-09-08 | 10.00 |
| 6 | 2 | 2005-09-08 | 11.20 |
| 7 | 3 | 2005-09-08 | 10.00 |
| 8 | 1 | 2005-09-01 | 10.00 |
+--+---------+--------------+-------+

SELECT DISTINCT gazoil.idstation,gazoil.prix,gazoil.date,station.id,station.marque,station.adresse
FROM gazoil,station
WHERE station.id=gazoil.idstation
GROUP BY idstation
ORDER BY date DESC, prix ASC

mon problème c'est qu'il faudrait d'abord trier par date !, de maniere à avoir les dates les plus recentes par idshop...

dan le cas présent j'ai :


+----+-----------+------------+-------+
| id | idshop | date | prix |
+--+---------+--------------+-------+
| 1 | 1 | 2005-09-03 | 10.00 |
| 2 | 2 | 2005-09-07 | 11.50 |
| 3 | 3 | 2005-09-06 | 10.30 |
| 4 | 4 | 2005-09-07 | 11.90 |
+--+---------+--------------+-------+

qui est ensuite trié par date :

+----+-----------+------------+-------+
| id | idshop | date | prix |
+--+---------+--------------+-------+
| 2 | 2 | 2005-09-07 | 11.50 |
| 4 | 4 | 2005-09-07 | 11.90 |
| 3 | 3 | 2005-09-06 | 10.30 |
| 1 | 1 | 2005-09-03 | 10.00 |
+--+---------+--------------+-------+


merci de votre aide!

Posté : 08 sept. 2005, 17:26
par raptor
Salut,

Si tu as un SGBR qui admet les sous requetes, c'est possible en une seule requete, sinon c'est pas possible en une seule et il faut donc gruger :)

@+

Posté : 08 sept. 2005, 18:02
par Invité
Salut,

Si tu as un SGBR qui admet les sous requetes, c'est possible en une seule requete, sinon c'est pas possible en une seule et il faut donc gruger :)

@+

Code : Tout sélectionner

SELECT * FROM ( SELECT gazoil.idstation, gazoil.prix, gazoil.date, station.id, station.marque, station.adresse FROM gazoil, station WHERE station.id = gazoil.idstation ORDER BY date DESC , prix ASC ) GROUP BY idstation LIMIT 0 , 30
par exemple ? (enfin celle là marche po..mais bon)

sinon, tu peux me montrer tes anti-sèches? :)

Posté : 08 sept. 2005, 21:00
par Cyrano
Dans le jeu d'essai que tu montres, tu ne mets qu'une seule table et les champs ne correspondent pas à ceux de la requête, difficile de tester quoique ce soit... Mais à priori, tu peux avoir ce que tu veux en une requête. Donne les jeux d'essai et les structure des deux tables.

Posté : 08 sept. 2005, 22:39
par Invité
bon, je remets tout ca en ordre :)

table shop

id marque
1 shop1
2 shop1
3 shop2
4 shop2
5 shop3
6 shop1
7 shop2

table produit

id idshop date prix
1 1 2005-09-03 11.20
2 2 2005-09-07 11.50
3 3 2005-09-06 10.30
4 4 2005-09-07 11.90
5 1 2005-09-08 10.00
6 2 2005-09-08 11.20
7 3 2005-09-08 10.00
8 1 2005-09-01 10.00

Code : Tout sélectionner

SELECT * FROM ( SELECT produit.idshop, produit.prix, produit.date, shop.id, shop.marque, shop.adresse FROM produit, shop WHERE shop.id = produit.idshop ORDER BY date DESC , prix ASC ) GROUP BY idshop LIMIT 0 , 30
mais ma requete fonctionne pas... elle est correcte au moins?

Posté : 08 sept. 2005, 22:48
par Invité
En supposant une table créée comme suit :
create table gazoil
(id number,
idshop number,
date_prix date,
prix number);
Voici une requête qui pourrait donner le résultat attendu :
select *
from gazoil g
where exists (select 1
from gazoil
where idshop = g.idshop
group by idshop
having max(date_prix) = g.date_prix)
order by date_prix desc

Posté : 08 sept. 2005, 22:53
par Ne_jure_que_par_Oracle

Code : Tout sélectionner

SELECT * FROM ( SELECT produit.idshop, produit.prix, produit.date, shop.id, shop.marque, shop.adresse FROM produit, shop WHERE shop.id = produit.idshop ORDER BY date DESC , prix ASC ) GROUP BY idshop LIMIT 0 , 30
mais ma requete fonctionne pas... elle est correcte au moins?
Non, on ne peut pas trier dans une sous-requête. On ne peut pas non plus utiliser la clause GROUP BY avec un "SELECT *".

Posté : 08 sept. 2005, 23:27
par Invité
SELECT *
FROM produit p
WHERE EXISTS ( SELECT 1 FROM produit WHERE idshop = p.idshop
GROUP BY idshop
HAVING max( date ) = p.date )
ORDER BY date DESC LIMIT 0 , 30
[/quote]


impeccable merci bcp :)
jsute une chose, j'arrive po a recup les données sur le shop... nom et adresse.

j'ai essayé de modif ta requete, mais ss succès...

Posté : 08 sept. 2005, 23:52
par Ne_jure_que_par_Oracle
Et en écrivant comme ceci ?

Code : Tout sélectionner

SELECT p.idshop, p.prix, p.date, s.id, s.marque, s.adresse FROM produit p, shop s WHERE s.id = p.idshop AND EXISTS ( SELECT 1 FROM produit WHERE idshop = p.idshop GROUP BY idshop HAVING max( date ) = p.date ) ORDER BY date DESC LIMIT 0 , 30