Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 11/06/2011, 10h13   #1
Membre du Club
 
Avatar de PIEPLU
 
Inscription : avril 2003
Messages : 299
Détails du profil
Informations personnelles :
Âge : 30

Informations forums :
Inscription : avril 2003
Messages : 299
Points : 40
Points : 40
Envoyer un message via MSN à PIEPLU Envoyer un message via Skype™ à PIEPLU
Par défaut Grouper des valeurs par date

Bonjour,

J'ai un gros souci à résoudre.

J'ai une table Messages avec comme champs
dt_message ; id_sujet

Je voudrais afficher le dernier message de chaque sujet (id_sujet) dans une page.

J'ai fait comme ceci :
Code :
SELECT * FROM Messages GROUP BY id_sujet ORDER dt_message DESC

Le souci, c'est qu'il ne prend pas la dernière date (dt_message) à cause du group by :S

Que puis je faire ?

Merci beaucoup !!!
__________________
Vincent Pieplu
Développeur Site Internet
PIEPLU est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/06/2011, 10h56   #2
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 723
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Expert SQL Server
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 723
Points : 6 844
Points : 6 844
Si vous travaillez avec SQL Server :

Code :
1
2
3
4
5
6
7
8
9
10
11
DECLARE @T TABLE
(
 id_sujet INT,
 dt_message DATETIME
);
 
INSERT @T VALUES (1, '20100101');
INSERT @T VALUES (1, '20110101');
INSERT @T VALUES (2, '20100303');
INSERT @T VALUES (2, '20100606');
INSERT @T VALUES (2, '20101010');
1ere solution :

Code :
1
2
3
4
5
6
7
8
SELECT 
 T.id_sujet,
 (SELECT TOP 1 dt_message
  FROM @T AS T2
  WHERE T2.id_sujet = T.id_sujet
  ORDER BY T2.dt_message DESC) AS dt_message
FROM @T AS T
GROUP BY id_sujet;
2eme solution :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
WITH CTE
AS
(
 SELECT 
  ROW_NUMBER() OVER(PARTITION BY id_sujet ORDER BY dt_message DESC) AS num,
  *
 FROM @T
)
SELECT 
 id_sujet,
 dt_message
FROM CTE
WHERE num = 1;
3eme solution :

Code :
1
2
3
4
5
6
7
8
9
SELECT DISTINCT 
 T.id_sujet, C.dt_message
FROM @T AS T
CROSS APPLY (
 SELECT TOP 1 T2.dt_message
 FROM @T AS T2
 WHERE T.id_sujet = T2.id_sujet
 ORDER BY T2.dt_message DESC
) AS C
A voir en fonction de la volumétrie que vous aurez à traiter

++
mikedavem est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/06/2011, 11h06   #3
Membre du Club
 
Avatar de PIEPLU
 
Inscription : avril 2003
Messages : 299
Détails du profil
Informations personnelles :
Âge : 30

Informations forums :
Inscription : avril 2003
Messages : 299
Points : 40
Points : 40
Envoyer un message via MSN à PIEPLU Envoyer un message via Skype™ à PIEPLU
Moi je vais rajouter des numéro de pages.
Lz solution la plus légère selon toi ? Merci
__________________
Vincent Pieplu
Développeur Site Internet
PIEPLU est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/06/2011, 13h07   #4
Membre du Club
 
Avatar de PIEPLU
 
Inscription : avril 2003
Messages : 299
Détails du profil
Informations personnelles :
Âge : 30

Informations forums :
Inscription : avril 2003
Messages : 299
Points : 40
Points : 40
Envoyer un message via MSN à PIEPLU Envoyer un message via Skype™ à PIEPLU
Je viens d'essayer les 3 solutions et elles retournent toutes des erreurs.

Solution 1 :
Citation:
Erreur de syntaxe près de '1 dt_message
FROM @T AS T2
WHERE T2.id_sujet = T.id_sujet
' à la ligne 3
Solution 2 :
Citation:
Erreur de syntaxe près de 'WITH CTE
AS
(
SELECT
ROW_NUMBER() OVER(PARTITION BY id_s' à la ligne 1
Solution 3 :
Citation:
Erreur de syntaxe près de '@T AS T
CROSS APPLY (
SELECT TOP 1 T2.dt_message
FROM @T AS' à la ligne 3
Aurais je pas de chance LOL

Merci
__________________
Vincent Pieplu
Développeur Site Internet
PIEPLU est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/06/2011, 13h12   #5
Membre du Club
 
Avatar de PIEPLU
 
Inscription : avril 2003
Messages : 299
Détails du profil
Informations personnelles :
Âge : 30

Informations forums :
Inscription : avril 2003
Messages : 299
Points : 40
Points : 40
Envoyer un message via MSN à PIEPLU Envoyer un message via Skype™ à PIEPLU
J'ai oublié de préciser que je travaille avec MySQL
__________________
Vincent Pieplu
Développeur Site Internet
PIEPLU est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/06/2011, 13h14   #6
Membre du Club
 
Avatar de PIEPLU
 
Inscription : avril 2003
Messages : 299
Détails du profil
Informations personnelles :
Âge : 30

Informations forums :
Inscription : avril 2003
Messages : 299
Points : 40
Points : 40
Envoyer un message via MSN à PIEPLU Envoyer un message via Skype™ à PIEPLU
Si j'ai bien compris, je pense que c'est ça que je voudrais:
http://www.developpez.net/forums/d41...by/#post283552

J'ai bien essayé mais j'ai pas réussi à le mettre en place !!

merci
__________________
Vincent Pieplu
Développeur Site Internet
PIEPLU est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/06/2011, 23h38   #7
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 008
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 008
Points : 18 279
Points : 18 279
Envoyer un message via MSN à CinePhil
Problème maintes fois évoqué !

Quelle est le dernier message par sujet ?
Apparemment, dans votre cas, c'est la colonne (et pas champ ! ) dt_message qui permet de le savoir.
dt = date ? Si oui, pourquoi ne pas avoir appelé la colonne date_message ?

Code :
1
2
3
SELECT id_sujet, MAX(dt_message) AS dt_max
FROM Messages
GROUP BY id_sujet
Ensuite on récupère les autres colonnes souhaitées correspondant à cette dt_max en faisant une jointure de cette requête avec la table.
Code :
1
2
3
4
5
6
7
8
9
10
SELECT les_colonnes_souhaitees_et_pas_etoile
FROM Messages m
INNER JOIN
(
  SELECT id_sujet, MAX(dt_message) AS dt_max
  FROM Messages
  GROUP BY id_sujet
) tmp 
  ON tmp.id_sujet = m.id_sujet
  AND tmp.dt_max = m.dt_message
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h05.


 
 
 
 
Partenaires

Hébergement Web