besoin de faire un ORDER BY avant un GROUP BY

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : besoin de faire un ORDER BY avant un GROUP BY

par Ne_jure_que_par_Oracle » 08 sept. 2005, 23:52

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

par Invité » 08 sept. 2005, 23:27

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...

par Ne_jure_que_par_Oracle » 08 sept. 2005, 22:53

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 *".

par Invité » 08 sept. 2005, 22:48

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

par Invité » 08 sept. 2005, 22:39

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?

par Cyrano » 08 sept. 2005, 21:00

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.

par Invité » 08 sept. 2005, 18:02

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? :)

par raptor » 08 sept. 2005, 17:26

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 :)

@+

besoin de faire un ORDER BY avant un GROUP BY

par trax » 08 sept. 2005, 17:06

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!