Tri tordu : le retour

Le
Etienne SOBOLE
salut j'ai deux tables

create member
(
idmember serial,
nom text,
);

create article
(
idarticle serial,
idmember interer /* cle vers le table membre */
date timestamp,
article text
);

voila je voudrait faire un
SELECT * FROM member INNER JOIN article ON member.idmember =
article.idmember

sauf que je voudrai trier cette requete par utilisateur et par date sauf que
le critère de tri des utilisateurs n'est pas le nom mais la date du plus
recent article.
en gros si le dernier message vient de toto je voudrai avoir tous les
messages de toto en premiers triés par ordre de date decroissants.

voila.
c'est faisable en une seul requete ca?

merci
Etienne
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Jogo
Le #21851631
create member
(
idmember serial,
nom text,
);

create article
(
idarticle serial,
idmember interer /* cle vers le table membre */
date timestamp,
article text
);

voila je voudrait faire un
SELECT * FROM member INNER JOIN article ON member.idmember =
article.idmember

sauf que je voudrai trier cette requete par utilisateur et par date
sauf que le critère de tri des utilisateurs n'est pas le nom mais la
date du plus recent article.

c'est faisable en une seul requete ca?



Ça dépend si tu comptes les requêtes imbriquée ;)

En fait ton problème n'en serait plus un si tu avais un champs
dateLastArticle dans ta table Member. Je te conseille vivement de
l'ajouter si ton tri doit être effectué souvent (utilise un trigger
pour le garder à jour).

Mais bon, puisque ce champs n'existe pas, il va falloir l'inventer.
On se retrouve donc avec un truc du genre :

SELECT m.nom, a.date, a.article
FROM (
SELECT n.idmember, n.nom, max(b.date) AS dateLastArticle
FROM Member n INNER JOIN Article b ON n.idmember = b.idmember
GROUP BY n.idmember, n.nom ) m
INNER JOIN Article a ON m.idmember = a.idmember
ORDER BY m.dateLastArticle DESC, m.nom ASC, a.date DESC


--
La douleur me prive de ma chair, comme le plaisir me la donne.
- Jean-Luc Marion - Le phénomène érotique -
nobody
Le #21851621
Etienne SOBOLE a écrit :
salut j'ai deux tables

create member
(
idmember serial,
nom text,
);

create article
(
idarticle serial,
idmember interer /* cle vers le table membre */
date timestamp,
article text
);

voila je voudrait faire un
SELECT * FROM member INNER JOIN article ON member.idmember =
article.idmember

sauf que je voudrai trier cette requete par utilisateur et par date sauf que
le critère de tri des utilisateurs n'est pas le nom mais la date du plus
recent article.
en gros si le dernier message vient de toto je voudrai avoir tous les
messages de toto en premiers triés par ordre de date decroissants.

voila.
c'est faisable en une seul requete ca?




oui sous SEQUEL c'est

SORT article BY MAX date idmember RUPTURE idmember





merci
Etienne



Etienne SOBOLE
Le #21851611
Merci je vais tester ca.

peut etre effectivement que je créerai le fameux champ lastdate a moins que
je ne passe par une vue.
en tous cas, merci pour ton aide, je teste...

Etienne

"Jogo"
create member
(
idmember serial,
nom text,
);

create article
(
idarticle serial,
idmember interer /* cle vers le table membre */
date timestamp,
article text
);

voila je voudrait faire un
SELECT * FROM member INNER JOIN article ON member.idmember >> article.idmember

sauf que je voudrai trier cette requete par utilisateur et par date
sauf que le critère de tri des utilisateurs n'est pas le nom mais la
date du plus recent article.

c'est faisable en une seul requete ca?



Ça dépend si tu comptes les requêtes imbriquée ;)

En fait ton problème n'en serait plus un si tu avais un champs
dateLastArticle dans ta table Member. Je te conseille vivement de
l'ajouter si ton tri doit être effectué souvent (utilise un trigger
pour le garder à jour).

Mais bon, puisque ce champs n'existe pas, il va falloir l'inventer.
On se retrouve donc avec un truc du genre :

SELECT m.nom, a.date, a.article
FROM (
SELECT n.idmember, n.nom, max(b.date) AS dateLastArticle
FROM Member n INNER JOIN Article b ON n.idmember = b.idmember
GROUP BY n.idmember, n.nom ) m
INNER JOIN Article a ON m.idmember = a.idmember
ORDER BY m.dateLastArticle DESC, m.nom ASC, a.date DESC


--
La douleur me prive de ma chair, comme le plaisir me la donne.
- Jean-Luc Marion - Le phénomène érotique -
Fred Brouard - SQLpro
Le #21851591
Solution :

create table member
(
idmember int,
nom varchar(16),
);

INSERT INTO member VALUES (1, 'toto')
INSERT INTO member VALUES (2, 'titi')
INSERT INTO member VALUES (3, 'tutu')

create table article
(
idarticle int,
idmember int, /* cle vers le table membre */
dateart datetime,
article varchar(16)
);

INSERT INTO article VALUES (1, 1, '20050101', 'pelle')
INSERT INTO article VALUES (2, 1, '20050303', 'pioche')
INSERT INTO article VALUES (3, 2, '20050404', 'rateau')
INSERT INTO article VALUES (4, 2, '20050202', 'bèche')


SELECT *, (SELECT max(dateart)
FROM article a2
WHERE a2.idmember = a.idmember) AS dmax
FROM member m
INNER JOIN article a
ON m.idmember = a.idmember
ORDER BY dmax DESC, nom, dateart DESC


A +

Etienne SOBOLE a écrit :
salut j'ai deux tables

create member
(
idmember serial,
nom text,
);

create article
(
idarticle serial,
idmember interer /* cle vers le table membre */
date timestamp,
article text
);

voila je voudrait faire un
SELECT * FROM member INNER JOIN article ON member.idmember =
article.idmember

sauf que je voudrai trier cette requete par utilisateur et par date sauf que
le critère de tri des utilisateurs n'est pas le nom mais la date du plus
recent article.
en gros si le dernier message vient de toto je voudrai avoir tous les
messages de toto en premiers triés par ordre de date decroissants.

voila.
c'est faisable en une seul requete ca?

merci
Etienne







--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
nobody
Le #21851581
Fred Brouard - SQLpro a écrit :
Solution :


SELECT *, (SELECT max(dateart)
FROM article a2
WHERE a2.idmember = a.idmember) AS dmax
FROM member m
INNER JOIN article a
ON m.idmember = a.idmember
ORDER BY dmax DESC, nom, dateart DESC


A +





et sous SEQUEL c'est

SORT article BY MAX date idmember RUPTURE idmember
Etienne SOBOLE
Le #21851571
Merci a tout le monde

C'est cool :)
Publicité
Poster une réponse
Anonyme