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 : GROUP BY

Re: GROUP BY

par romje » 24 mai 2011, 21:07

Je n'ai pas regardé le problème de trop près mais on peut résumer :
tu fais un group by sur une colonne et tu veux faire un tri sur une colonne qui n'est pas celle du group by.
Il faut faire une sous requête et récupérer ton premier jeu d'enregistrement trié puis faire un group by.
SELECT * FROM (SELECT * ORDER BY ma_colonne tri)

Exemple avec une autre table :
SELECT id_etablissement, GROUP_CONCAT(date_ajout) FROM (SELECT * FROM dossier ORDER BY date_ajout) tmp GROUP BY id_etablissement

PS : j'ai passé plusieurs heures à décortiquer ce problème il y a quelques mois à mon sens il n'y a pas d'autre solution

Re: GROUP BY

par devlop78 » 21 janv. 2011, 16:47

Bonjour,

Je croyais que les colonnes retournées par un select group by devaient soit être dans la clause group by soit être associées à une fonction de type max(), min(), sum()...

Edit : source : http://dev.mysql.com/doc/refman/5.0/fr/ ... ields.html
En SQL standard, vous devriez ajouter la colonne customer.name à la clause GROUP BY. Avec MySQL, ce nom est redondant si vous n'utilisez pas le mode ANSI.

N'utilisez pas cette fonctionnalité si les colonnes que vous omettez dans la clause GROUP BY ne sont pas unique dans le groupe!! Vous auriez des résultats inattendus!
Non. Attention à l'interprétation de la documentation de Mysql, ne pas oublier qu'il s'agit d'une traduction de mauvaise qualité (même si globalement, on comprend).

Re: GROUP BY

par Mazarini » 21 janv. 2011, 12:44

Bonjour,

Je croyais que les colonnes retournées par un select group by devaient soit être dans la clause group by soit être associées à une fonction de type max(), min(), sum()...

Edit : source : http://dev.mysql.com/doc/refman/5.0/fr/ ... ields.html
En SQL standard, vous devriez ajouter la colonne customer.name à la clause GROUP BY. Avec MySQL, ce nom est redondant si vous n'utilisez pas le mode ANSI.

N'utilisez pas cette fonctionnalité si les colonnes que vous omettez dans la clause GROUP BY ne sont pas unique dans le groupe!! Vous auriez des résultats inattendus!

Re: GROUP BY

par Elie » 21 janv. 2011, 11:59

Tout simplement parce que DISTINCT marche pas du tout si tu as 2 champs differents.
Si tu fais un DISTINCT lettre sur A 1, A 2 il va te sortir les 2 pourtant A etait bien la meme lettre.

Re: GROUP BY

par dunbar » 21 janv. 2011, 01:08

Pourquoi pas comme ceci alors ???
                               $sql = "SELECT
                                    `tbl_kick`.`id_kick`,
                                    DISTINCT (tbl_kick.membre_id),
                                    `tbl_kick`.`url`,
                                    `tbl_membre`.`titre`,
                                    `tbl_membre`.`nb_kick`,
                                    `tbl_membre`.`url` as `url_membre`,
                                    `tbl_membre`.`fichier`
                                  FROM `tbl_kick`, `tbl_membre`
                                  WHERE
                                       `tbl_kick`.`membre_id` = `tbl_membre`.`id_membre`
                                  AND `tbl_membre`.`activate` = 1
                                  ORDER BY `tbl_kick`.`id_kick` DESC LIMIT 6";

Re: GROUP BY

par Elie » 21 janv. 2011, 00:08

Bah oui mais je veux en gros un DISTINCT des membre_id ... Donc je voulais faire un GROUP BY membre_id pour eviter les doublons ...
Parce que DISTINCT ne ressous pas la solution et GROUP BY lit les infos en partant de 0 a 100 et pas de 100 a 0 meme si il y a un DESC

J'espere avoir été clair sinon on repart de 0 :)

Re: GROUP BY

par dunbar » 20 janv. 2011, 19:34

Salut,

Ci j'ai bien capter l'idée remplace ASC par DESC LIMIT 6 il va ne prendre que les 6 derniers infos.
                         $sql = "SELECT
                                    `tbl_kick`.`id_kick`,
                                    `tbl_kick`.`membre_id`,
                                    `tbl_kick`.`url`,
                                    `tbl_membre`.`titre`,
                                    `tbl_membre`.`nb_kick`,
                                    `tbl_membre`.`url` as `url_membre`,
                                    `tbl_membre`.`fichier`
                                  FROM `tbl_kick`, `tbl_membre`
                                  WHERE
                                       `tbl_kick`.`membre_id` = `tbl_membre`.`id_membre`
                                  AND `tbl_membre`.`activate` = 1
                                  ORDER BY `tbl_kick`.`id_kick` DESC LIMIT 6";
                          
                          $req = mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error()); 
A+

Re: GROUP BY

par Elie » 20 janv. 2011, 18:28

Bon je relance mon sujet parce que j'ai compris la logique.
Un GROUP BY commence par le début et pas par la fin ...
Donc si il trouve une info en premier il la prend comme réference.
En fait oui, il faudrait que je fasse un tableau en PHP qui lit toutes les infos en partant par la fin et qui n'en garde que 6.

Voilà ma solution mais je suis pas satisfait !
			  $sql = "SELECT `tbl_kick`.`id_kick`, `tbl_kick`.`membre_id`, `tbl_kick`.`url`, `tbl_membre`.`titre`, `tbl_membre`.`nb_kick`, `tbl_membre`.`url` as `url_membre`, `tbl_membre`.`fichier` FROM `tbl_kick`, `tbl_membre` WHERE `tbl_kick`.`membre_id` = `tbl_membre`.`id_membre` AND `tbl_membre`.`activate` = 1 ORDER BY `tbl_kick`.`id_kick` ASC";
			  $req = mysql_query($sql) or die(erreurMySQL($sql, mysql_error()));
			  $member = array();
			  while($row = mysql_fetch_array($req)) {
				  
				  $member[$row['membre_id']] = array($row['id_kick'], $row['url'], $row['titre'], $row['nb_kick'], $row['url_membre'], $row['fichier']);
				  
			  }
			  
			 
			  rsort($member); 						// On inverse le tableau
			  $member = array_chunk($member, 6);	// On en garde que 6
			  $num = count($member[0]);
			  
			  foreach($member[0] as $k => $v) {			  
			   }
Si quelqu'un sait comment simplifier ca :)

Merci,

Elie

Re: GROUP BY

par Elie » 20 janv. 2011, 11:35

J'ai lu ta réponse en diagonal et je n'ai pas bien compris où tu voulais en venir...
Oui Je fais d'abord un WHERE pour filtrer, un GROUP BY pour éviter les doublons et un ORDER BY pour imposser l'autre de lecture mais ca me dit pas pourquoi le GROUP BY filtre des informations.

Re: GROUP BY

par devlop78 » 20 janv. 2011, 01:27

J'ai lu en diagonal, mais ORDER BY est appliqué après GROUP BY, lui-même appliqué après WHERE.

GROUP BY

par Elie » 20 janv. 2011, 00:45

Hello,

J'affiche mes infos mais c'est juste pour comprendre.

Sans le GROUP BY, les id_kick DESC marche tres bien !
SELECT `tbl_kick`.`id_kick` , `tbl_kick`.`membre_id` , `tbl_kick`.`url` , `tbl_membre`.`titre` , `tbl_membre`.`nb_kick` , `tbl_membre`.`url` AS `url_membre` , `tbl_membre`.`fichier`
FROM `tbl_kick` , `tbl_membre`
WHERE `tbl_kick`.`membre_id` = `tbl_membre`.`id_membre`
AND `tbl_membre`.`activate` =1
ORDER BY `tbl_kick`.`id_kick` DESC
LIMIT 0 , 6

Code : Tout sélectionner

3184 100 nike-air-180-2010 comon 22 comon comon.jpg 3183 85 bape-bapesta-2010 coolcats92 1 coolcats92 coolcats92.jpg 3182 98 air-jordan-x-10-1994 MAIRJ 38 mairj mairj.jpg 3181 98 air-jordan-11-retro-2001 MAIRJ 38 mairj mairj.jpg 3180 213 supra-skytop-2009 Sakey 1 sakey sakey.jpg 3179 169 air-jordan-trunner-lx-premier-2006 Ms_KMTB_LIFE 94 ms_kmtb_life ms_kmtb_life.jpg
Avec le GROUP BY, il me prend pas le premier pourtant le ORDER BY devrait imposer le premier non ?
SELECT `tbl_kick`.`id_kick` , `tbl_kick`.`membre_id` , `tbl_kick`.`url` , `tbl_membre`.`titre` , `tbl_membre`.`nb_kick` , `tbl_membre`.`url` AS `url_membre` , `tbl_membre`.`fichier`
FROM `tbl_kick` , `tbl_membre`
WHERE `tbl_kick`.`membre_id` = `tbl_membre`.`id_membre`
AND `tbl_membre`.`activate` =1
GROUP BY `tbl_kick`.`membre_id`
ORDER BY `tbl_kick`.`id_kick` DESC
LIMIT 0 , 6

Code : Tout sélectionner

id_kick Décroissant membre_id url titre nb_kick url_membre fichier 3183 85 bape-bapesta-2010 coolcats92 1 coolcats92 coolcats92.jpg 3180 213 supra-skytop-2009 Sakey 1 sakey sakey.jpg 3158 226 air-jordan-spizike-2007 BenG 8 beng beng.jpg 3148 224 nike-air-huarache-light-1993 amajo 10 amajo amajo.jpg 3106 219 diadora-the-queen-70-ed-moses-2010 Kicks Maniac 1 kicks-maniac kicks-maniac.jpg 3089 188 air-jordan-6-retro-2010 Darius 13 darius darius.jpg
La question est pourquoi ... Je devrais logiquement avoir 100, 85, 98, 213, ...

Merci,

Elie