PHP - GROUP BY et ORDER BY

PHP - GROUP BY et ORDER BY - SQL/NoSQL - Programmation

Marsh Posté le 30-08-2007 à 10:27:44    

Salut à tous,
Je fait une stat du nombre d'images la plus vue en fonction du temps (la plus vue des 15 dernières minutes, 30...) et j'ai fait la requête suivante, mais quelque chose ne tourne pas rond, une idée ?
 

Code :
  1. SELECT id_img, date, SUM(value) FROM $table_images_stat WHERE date>($time_now-$clic_time) GROUP BY id_img ORDER BY 'SUM(value)' DESC, id_img DESC


 
le $time_now-$clic_time c'est pour prendre en compte uniquement les stats des 15 dernières minutes (ou 30...)
le id_img DESC sert à obtenir l'image la plus récente parmi celle qui ont le même total de visite
 
Merci de votre aide.

Reply

Marsh Posté le 30-08-2007 à 10:27:44   

Reply

Marsh Posté le 30-08-2007 à 10:43:24    

virer les quotes autours de sum(value) dans ton order by

Reply

Marsh Posté le 30-08-2007 à 11:03:07    

Autre solution :
SELECT id_img, date, SUM(value) AS Somme FROM $table_images_stat WHERE date>($time_now-$clic_time) GROUP BY id_img ORDER BY Somme DESC, id_img DESC

Reply

Marsh Posté le 30-08-2007 à 13:27:47    

merci pour l'info, mais sans les ' il y a une erreur.
il faudra que j'essaye la nouvelle requête

Reply

Marsh Posté le 30-08-2007 à 14:14:09    

la requête semble fonctionner, merci bien !!!

Reply

Marsh Posté le 30-08-2007 à 15:40:52    

ça arrive à mysql de respecter un tant soit peu les standards ? pkoi "date" n'est pas dans le group by ? et surtout, pourquoi ça marche sans qu'il y soit ? !!!


Message édité par MagicBuzz le 30-08-2007 à 15:41:06
Reply

Marsh Posté le 30-08-2007 à 17:37:31    

Heu c'est pas plutot l'inverse :??: i.e. il faut qu'un champs du group by soit dans le select.
 
Et puis encore j'suis pas sur parfois y'a surtout la syntaxe Oracle qu'on prends pour du SQL standard. :D


---------------
| AMD Ryzen 7 7700X 8C/16T @ 4.5-5.4GHz - 64GB DDR5-6000 30-40-40 1T - AMD Radeon RX 7900 XTX 24GB @ 2680MHz/20Gbps |
Reply

Marsh Posté le 30-08-2007 à 19:44:24    

Non, tu as le droit de faire un group by sur un champ non sélectionné (à vérifier tout de même).
Mais par contre, le GORUP BY doit porter sur TOUTES les colonnes calculées SAUF celles qui sont résultent d'une fonction de regroupement.
 
Ainsi, par exemple :
 

Code :
  1. SELECT count(*) cpt, abs(qte) absqte, sum(prix), nom FROM trucmuche GROUP BY abs(qte), nom


 
Ce qui est parfaitement normal.
 
Voici ce que dit la doc de SQL Server 2005 sur le sujet (soit rigoureusement la même chose qu'Oracle) :
http://msdn2.microsoft.com/fr-fr/library/ms177673.aspx

Citation :


Spécifie les groupes sur lesquels positionner les lignes de sortie. Si les fonctions d'agrégation sont comprises dans la clause SELECT <select list>, GROUP BY calcule une valeur de résumé pour chaque groupe. Lorsque GROUP BY est spécifiée, vous devez inclure dans la liste GROUP BY chaque colonne de toute expression de non-agrégation figurant dans la liste de sélection, ou l'expression GROUP BY doit correspondre exactement à l'expression figurant dans la liste de sélection.


 
Les exemples ensuite parlent d'eux-même.
 
Ici, un topo sur la norme SQL. On découvre que GROUP BY a été introduit avec la version 2 de la norme "SQL 2".
http://sql.developpez.com/sqlaz/ensembles/#L1

Citation :


NOTA :
 
 
La présence de la clause GROUP BY est nécessaire dès que la clause de sélection, ou le filtre WHERE, ou encore les jointures comportent simultanément des calculs d'agrégation et la présence de colonnes de table hors de calculs d'agrégation.  
De plus, outes les colonnes représentées hors des calculs d'agrégation doivent figurer dans la clause GROUP BY.  


(c'est un peu chiant, c'est bourré de fautes de frappes mais bon [:spamafote]

Reply

Marsh Posté le 30-08-2007 à 19:48:27    

Heu a vrai dire peut etre que si c'est obligatoire, c'est fait tout seul...
 
En tout cas chose sur, dans Oracle on ne peut pas faire de group by sur un champs nom selectionné. Mais bon c'est oracle einh. Ca supporte pas les left outer join à la base donc bon :D


---------------
| AMD Ryzen 7 7700X 8C/16T @ 4.5-5.4GHz - 64GB DDR5-6000 30-40-40 1T - AMD Radeon RX 7900 XTX 24GB @ 2680MHz/20Gbps |
Reply

Marsh Posté le 30-08-2007 à 19:55:48    

Possible pour Oracle, c'est vrai que sur certains points il est particulièrement nul.
 
Maintenant je me référence surtout à la syntaxe de SQL Server 2005, car c'est vraiment très proche de la norme maintenant.
 
De plus, pour le group by, ça c'est sûr, j'ai toujours appris comme ça depuis le début.
 
Sinon, MySQL fait en fait un truc très sympa et plus poussé :
 
SELECT MIN(ID) id, nom
FROM produits
 
=> Il va te ramener l'ID du produit qui a le plus petit ID avec son nom. Chose qui est horrible à faire avec la norme. En soit, c'est cool, mais absolument pas standard.

Reply

Marsh Posté le 30-08-2007 à 19:55:48   

Reply

Marsh Posté le 31-08-2007 à 00:19:04    

en tout cas, la requete de rufo fonctionne bien.
Pour MySQL, il n'est pas nécessaire de mettre le "date" dans le Group By, j'utilise le "date" uniquement pour prendre les dernières stat.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed