Requete GROUP BY [Résolu]

Signaler
Messages postés
12
Date d'inscription
vendredi 19 mars 2004
Statut
Membre
Dernière intervention
13 octobre 2014
-
Messages postés
12
Date d'inscription
vendredi 19 mars 2004
Statut
Membre
Dernière intervention
13 octobre 2014
-
Bonjour,
J'ai fait un site album photos, les photos sont classées par catégories et sous-catégories.
Je voudrais que lorsque l'on arrive sur la page catégorie il y ai la dernière photo enregistrée de chaque sous catégorie qui s'affiche.
J'ai fait :
$query "SELECT * FROM photos WHERE Cat'Voyages' GROUP BY SCat DESC ";

Ou encore :
$query "SELECT MAX(ID),Cat,SCat,Img FROM photos WHERE Cat'Voyages' GROUP BY SCat DESC ";

Mais c'est toujours la première photo enregistrée et non la dernière qui s'affiche.

Est-ce que quelqu'un peut m'éclairer sur mon erreur ?

Merci.

9 réponses

Messages postés
420
Date d'inscription
vendredi 28 novembre 2003
Statut
Membre
Dernière intervention
20 mars 2006

Bon j'avais pas le temps d'y réflechir car j'étais au boulot. Mais de
toute façon, dans une même catégorie, je suppose que tu vas vouloir
lister les sous categories. Ce qui implique une requête de ce type :

$query = 'SELECT id,nom FROM categorie WHERE id_parent='.$id_categorie_actuelle.' ORDER BY nom ASC' ;



Et dans tous les cas tu devras faire une boucle pour afficher tes catégories.

Donc dans la boucle tu devra mettre :

$query 'SELECT url FROM photos WHERE id_cat '.$data['id'].' ORDER BY date DESC LIMIT 1' ;



Bon ce qui est embêtant c'est que ça fait une requête par catégorie... Mais je ne sais pas si on peut faire mieux...
Messages postés
861
Date d'inscription
mardi 26 mars 2002
Statut
Membre
Dernière intervention
29 novembre 2006
1
Sael og blesud



BY ORDER ASD ... ;-)

Bon courage ...

NB : Si la réponse vous convient merci de l'accepter pour fermer ce thread ...


Sigurjón Bírgir Sigurðssón aka Sjón
Messages postés
2350
Date d'inscription
mercredi 13 octobre 2004
Statut
Membre
Dernière intervention
18 avril 2015
3
asc plutot non ?
Messages postés
861
Date d'inscription
mardi 26 mars 2002
Statut
Membre
Dernière intervention
29 novembre 2006
1
Sael og blesud



C'est sûr ... Lol ... ;-)

Bon courage ...

NB : Si la réponse vous convient merci de l'accepter pour fermer ce thread ...

Sigurjón Bírgir Sigurðssón aka Sjón
Messages postés
420
Date d'inscription
vendredi 28 novembre 2003
Statut
Membre
Dernière intervention
20 mars 2006

Moi personnellement je ferai (oui c'est au futur et non au conditionnel, je vais refaire ma galerie ;p) :

table categories :

- id

- nom

- description



table images :

- id

- id_cat

- url

- titre

- auteur

- descriptions

- date







et ma requête :

$query = ' SELECT nom, date FROM images ' ; // Les champs que je
vais utiliser. je ne récupère pas url, car j'affiche les miniature
correspondantes qui sont de la forme /minis/[id].jpg

$query.' WHERE id_cat '.$id_categorie ; // Pour bien sélectionner uniquement les image d'une catégorie

$query.= ' ORDER BY date DESC '; // Ordonner du plus récent au plus vieux

$query.= ' LIMIT 1 '; // Prendre le premier résultat uniquement
Messages postés
12
Date d'inscription
vendredi 19 mars 2004
Statut
Membre
Dernière intervention
13 octobre 2014

Salut, et merci d'avoir répondu aussi rapidement,

Mon problème c'est que je n'ai pas que des catégories.

Dans mon album, j' ai 3 pages : Voyages, Famille, Divers.
Dans ces 3 pages les sous-catégories se crées au fur et à mesure.
Exemple :
Dans Voyages il y aura un sous-menu :
- Bretagne
- Camargue
- etc... quand j'ajouterai des photos d'un autre voyage...

Quand j'arrive sur Voyages je voudrais que la dernière photo de chaque sous-catégories s'affiche.
Avec ma requete, si je mets un ORDER BY, c'est le résultat de ma requete qui est classé, et je ne vois pas comment demander un classement à l'intèrieur de la sous-catégorie ?

J'arrive à ce résultat en faisant :
$query "SELECT DISTINCT SCat FROM photos WHERE Cat'Voyages' ORDER BY ID DESC";
$res = mysql_query($query) or die($query.'
'.mysql_error());
$nombre = mysql_num_rows($res);
while ($row = mysql_fetch_array($res,MYSQL_ASSOC))
{
$scat = $row['SCat']; $qr "SELECT * FROM photos WHERE Cat'Voyages' AND SCat ='$scat' ORDER BY ID DESC LIMIT 1";

Mais j'aurais aimé pouvoir le faire en une seule requete !!!

Ce doit bien être possible.
Messages postés
420
Date d'inscription
vendredi 28 novembre 2003
Statut
Membre
Dernière intervention
20 mars 2006

Personnellement, je pense que ta table, telle que je l'apeçois à travers tes requêtes, n'est pas très bien conçue.

J'ai l'impression qu'a chaque photo, tu es obligé de répéter le nom de la catégorie et de la sous-catégorie d'appartenance.
Et ça, vois-tu, c'est une grosse erreur de structure. Normalement, il NE DOIT PAS y avoir de répétition de données dans un base de données!

Je te conseil de faire quelque chose de ce genre :
table catégories :
- id (PRIMARY KEY, auto_increment)
- id_parent
- nom

table photos :
- id
- id_cat
- nom
- url
- etc...

Ainsi, tu ne répète qu'un petit nombre (id dans table catégorie <=> id_cat dans table photos) et c'est beaucoup plus simple.
Pour la hierarchie entre catégories, elle est représentée par id_parent qui est égale à 0 si c'est une catégorie de base, et égale à l'id de la catégorie si c'est une sous-catégorie.

Par contre, il ne me semble pas possible de tout faire en une seule requête... (Mais je peux me tromper =) )
Messages postés
12
Date d'inscription
vendredi 19 mars 2004
Statut
Membre
Dernière intervention
13 octobre 2014

Merci monoceros01, et je suis tout à fait d'accord avec toi, j'aurais dû faire 2 tables, mais j'ai fait ça dans l'urgence et ma table ne contient que 5 champs.
A présent j'ai le temps et je vai tout reprendre.

Je pense moi aussi que je n'arriverai pas à faire une seule requête et c'est bien dommage ! ;-)
Messages postés
12
Date d'inscription
vendredi 19 mars 2004
Statut
Membre
Dernière intervention
13 octobre 2014

Ce que j'ai fait fonctionne très bien aussi :
$query "SELECT DISTINCT SCat FROM photos WHERE Cat'Voyages' ORDER BY ID DESC";
$res = mysql_query($query) or die($query.'
'.mysql_error());
$nombre = mysql_num_rows($res);
while ($row = mysql_fetch_array($res,MYSQL_ASSOC))
{
$scat = $row['SCat']; $qr "SELECT * FROM photos WHERE Cat'Voyages' AND SCat ='$scat' ORDER BY ID DESC LIMIT 1";

J'utilise un while, mais ça revient au même, je crois que je vai en rester là. Mais j'aime bien chercher donc ....

Merci encore de ton aide