Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Tri tordu : le retour

6 réponses
Avatar
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

6 réponses

Avatar
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 -
Avatar
nobody
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



Avatar
Etienne SOBOLE
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" a écrit dans le message de news:

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 -
Avatar
Fred Brouard - SQLpro
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 ***********************
Avatar
nobody
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
Avatar
Etienne SOBOLE
Merci a tout le monde

C'est cool :)