OVH Cloud OVH Cloud

tri un peu special

6 réponses
Avatar
Etienne SOBOLE
salut.

j'ai dans une base de donnée des fichies Fichier et des evenements sur ces
fichies
en gros ca donne

CREATE TABLE "fichier" (
"idfichier" integer auto incremente,
"nom" text,
...
);

CREATE TABLE "file_event" (
"idevent" integer auto incremente,
"idfichier" integer DEFAULT NOT NULL,
"date_event" timestamp DEFAULT "timestamp"('now'::text),
"evtype" integer,
...
FOREIGN key (idfichier) REFERENCES fichier(idfichier),
);

voila. donc j'ai evidement plusieurs evenements par fichier.
ce que je cherche a faire c'est récupérer les 20 derniers fichiers ayant eu
un evenement...
un truc genre
SELECT fichier.* FROM fichier INNER JOIN file_event ON fichier.idfichier =
file_event.idfichier ORDER BY date_event LIMIT 20;

seulement voila, si j'ai deux evenement sur un meme fichier, ce fichier sort
deux fois, ce qui n'est pas terrible.

merci.
Etienne

6 réponses

Avatar
Manu Pavy
Salut,
un "SELECT DISTINCT fichier.* ..." ?

Manu


Etienne SOBOLE a fait part de :

salut.

j'ai dans une base de donnée des fichies Fichier et des evenements su r ces
fichies
en gros ca donne

CREATE TABLE "fichier" (
"idfichier" integer auto incremente,
"nom" text,
...
);

CREATE TABLE "file_event" (
"idevent" integer auto incremente,
"idfichier" integer DEFAULT NOT NULL,
"date_event" timestamp DEFAULT "timestamp"('now'::text),
"evtype" integer,
...
FOREIGN key (idfichier) REFERENCES fichier(idfichier),
);

voila. donc j'ai evidement plusieurs evenements par fichier.
ce que je cherche a faire c'est récupérer les 20 derniers fichiers ayant eu
un evenement...
un truc genre
SELECT fichier.* FROM fichier INNER JOIN file_event ON fichier.idfichie r =
file_event.idfichier ORDER BY date_event LIMIT 20;

seulement voila, si j'ai deux evenement sur un meme fichier, ce fichier sort
deux fois, ce qui n'est pas terrible.

merci.
Etienne


Avatar
Life is just an illusion
Un petit DISTINCT devrais faire l'affaire non ?

--



"Etienne SOBOLE" a écrit dans le message de
news:41a1d23a$0$11062$
salut.

j'ai dans une base de donnée des fichies Fichier et des evenements sur ces
fichies
en gros ca donne

CREATE TABLE "fichier" (
"idfichier" integer auto incremente,
"nom" text,
...
);

CREATE TABLE "file_event" (
"idevent" integer auto incremente,
"idfichier" integer DEFAULT NOT NULL,
"date_event" timestamp DEFAULT "timestamp"('now'::text),
"evtype" integer,
...
FOREIGN key (idfichier) REFERENCES fichier(idfichier),
);

voila. donc j'ai evidement plusieurs evenements par fichier.
ce que je cherche a faire c'est récupérer les 20 derniers fichiers ayant


eu
un evenement...
un truc genre
SELECT fichier.* FROM fichier INNER JOIN file_event ON fichier.idfichier > file_event.idfichier ORDER BY date_event LIMIT 20;

seulement voila, si j'ai deux evenement sur un meme fichier, ce fichier


sort
deux fois, ce qui n'est pas terrible.

merci.
Etienne


Avatar
Etienne SOBOLE
"Life is just an illusion" a écrit dans le message de
news: 41a1deae$0$9081$
Un petit DISTINCT devrais faire l'affaire non ?




non.

un DISTINCT indique:
ERROR: For SELECT DISTINCT, ORDER BY expressions must appear in target list

Ce qui en gros me force a mettre la date dans le select et donc ne resoud
pas le probleme...
Etienne
Avatar
Etienne SOBOLE
"Manu Pavy" a écrit dans le message de news:
cnsmrm$shu$
Salut,
un "SELECT DISTINCT fichier.* ..." ?

Manu




non.

un DISTINCT indique:
ERROR: For SELECT DISTINCT, ORDER BY expressions must appear in target list

Ce qui en gros me force a mettre la date dans le select et donc ne resoud
pas le probleme...
Etienne
Avatar
Manu Pavy
Ce qui en gros me force a mettre la date dans le select et donc ne resoud
pas le probleme...
Etienne




Donc ta requete n est pas celle que tu indiques ?

Manu
Avatar
Etienne SOBOLE
"Manu Pavy" a écrit dans le message de news:
cnsp13$sun$
Donc ta requete n est pas celle que tu indiques ?



ben si, c'est juste qu'il ne veut pas d'un DISTINCT si je ne lui met pas le
date_event dans la liste du SELECT.

finalement j'ai trouvé la solution:

SELECT fichier.idfichier, fichier.nom FROM fichier INNER JOIN event ON
fichier.idfichier = event.idfichier GROUP BY fichier.idfichier, fichier.nom
ORDER BY max(date_event) DESC, idfichier DESC LIMIT 20;

l'idée est donc de trouvé le plus récent evènement pour chaque fichier.
voila. c'etait moins compliqué que je n'ai cru au départ.

Etienne