tri avant group by

Petit nouveau ! | 6 Messages

13 août 2013, 17:51

bonjour,
J'ai une table dans laquelle j'ai notament les colonnes id_matable, categorie_matable, date_matable
Je cherche à afficher du plus récent au plus vieux le dernier élément de chaque catégorie en excluant une catégorie que je ne veux pas afficher...

J'ai donc tenté :
SELECT * from matable WHERE categorie_matable != 'mauvaisecategorie'  GROUP BY categorie_matable ORDER BY id_matable DESC
et
SELECT * from (SELECT * from matable WHERE categorie_matable != 'mauvaisecategorie' ORDER BY id_matable DESC) as t GROUP BY categorie_matable
et
SELECT * from (SELECT * from matable WHERE categorie_matable != 'mauvaisecategorie' ORDER BY id_matable DESC) as t GROUP BY categorie_matable ORDER BY id_matable DESC
le souci c'est qu'à chaque fois il m'afficher les premiers éléments de ma table et non les derniers
par contre
SELECT * from matable WHERE categorie_matable != 'mauvaisecategorie' ORDER BY id_matable DESC
affiche bien dans le bon ordre, c'est à dire du plus récent au plus anciens, mais il affiche évidament toutes les lignes de chaque catégories...
Je pense que mon erreur est très bête mais je bloque dessus depuis un moment et tourne en rond alors si vous pouvez maider ce serait sympa.

Merci à vous

Bonne fin de journée :wink:

ViPHP
xTG
ViPHP | 7331 Messages

13 août 2013, 20:21

Pourquoi un group_by ?

Petit nouveau ! | 6 Messages

14 août 2013, 01:50

Hello!
En fait ça me semblait la meilleure solution vu que je ne veux qu'une réponse par categorie_matable (la derniere donnée enregistrée à chaque fois).

J'ai aussi essayé avec distinct mais là il ne me renvoie aucune réponse...

tu ferais autrement?

Merci

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

14 août 2013, 07:49

salut,


group y ne s'utilise qu'avec les fonctions de groupe, comme max, count, sum etc.

dans ton cas pour avoir le dernier enregistrement, tu peux utiliser un
SELECT * FROM matable WHERE id_matable = (select max(id_matable ) from matable where categorie_matable != 'mauvaisecategorie') ORDER BY id_matable DESC
ou, si tu utilise mysql tu peux utiliser la clause limit
SELECT * FROM matable WHERE categorie_matable != 'mauvaisecategorie') ORDER BY id_matable DESC limit 1
avec Oracle tu peux utiliser rownum (where rownum=1).


avec tous le monde tu peux utiliser les fonctions olap(rank(), dense rank etc) pour le faire.

@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 6 Messages

14 août 2013, 10:35

Bonjour Moogli.
Merci de ton aide, mais en fait ce n'est pas ce que je cherche.
Ce que tu me propose va aller chercher le dernier enregistrement toutes catégories confondues sauf categorie indesirable.

Or ce que je cherche à faire c'est d'afficher le dernier enregistrement de chaque categorie, sauf categorie indesirable, et de les afficher du plus récent au plus ancien.

Ce qui explique pourquoi je cherchais à utiliser group by, mais ce n'est pas approprié visiblement

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

14 août 2013, 13:20

Donc max(id) avec un group by catégorie pour alimenter le subselect de mon 1er exemple ;)

D'ailleurs j'ai laissé une ânerie ce n'est un égale mais un in qu'il faut utiliser avant le subselect.

Select * from latable where id in ( select max(id) from table where catégorie <> 'la mauvaise catégorie')

Test le subselect seul pour vérifier qu'il retourne bien ce que tu veux ;)



@+
Il en faut peu pour être heureux ......