[non résolu] Retourner le paragraphe le plus récent par document

Retourner le paragraphe le plus récent par document [non résolu] - SQL/NoSQL - Programmation

Marsh Posté le 07-09-2006 à 21:45:06    

Salut,
 
J'ai fait une requête qui retourne la liste des paragraphes les plus récemment modifiés pour chaque document se trouvant dans ma base.
 
TParagraphe : idpara | iddoc | date
 
on a un jeu d'essai de ce style :
1, 1, 01/01/2006
1, 2, 02/02/2006
2, 1, 03/03/2006
 
L'exécution de la requête doit retourner logiquement ceci :
 
2, 1, 03/03/2006 // 2ème paragraphe du document 1
1, 2, 02/02/2006 // 1er paragraphe du document 2
 
La requête ci-dessous fonctionne mais le problème c'est qu'elle met 26 secondes pour s'exécuter :D  
 

SELECT t.idpara, t.iddoc, t.date
FROM TParagraphe AS t
WHERE t.date = (
SELECT max( date )
FROM TParagraphe AS t2
WHERE t.iddoc = t2.iddoc
GROUP BY t2.iddoc )
GROUP BY t.iddoc
ORDER BY t.date DESC
LIMIT 5


Une idée ? Une solution ? ^^


Message édité par Inekman le 07-09-2006 à 23:12:44
Reply

Marsh Posté le 07-09-2006 à 21:45:06   

Reply

Marsh Posté le 07-09-2006 à 22:02:55    

Code :
  1. select t.idapra,t.idoc,t.date
  2. from TParagraphe t
  3. inner join
  4. (
  5. select idoc,max(date)
  6. from TParagraphe AS
  7. group by idoc
  8. )A on t.date=A.date and t.idoc=A.idoc


Message édité par betsamee le 07-09-2006 à 22:04:32
Reply

Marsh Posté le 07-09-2006 à 22:09:25    

Salut betsamee et merci pour ta participation.
 
" Unknown column 'A.date' in 'on clause' "
 
Voili :D

Reply

Marsh Posté le 07-09-2006 à 22:14:17    

Code :
  1. select t.idapra,t.idoc,t.date
  2. from TParagraphe t
  3. inner join
  4. (
  5. select idoc,max(date) as datemaxi
  6. from TParagraphe AS
  7. group by idoc
  8. )A on t.date=A.datemaxi and t.idoc=A.idoc

Reply

Marsh Posté le 07-09-2006 à 22:26:51    

Ayé j'ai trouvé :
 

Affichage des enregistrements 0 - 4 (5 total, traitement: 0.4732 sec.)


SELECT T.idpara, T.iddoc, T.date  
FROM TParagraphe AS T  
WHERE T.date =  
(
     SELECT MAX(T2.date)  
     FROM TParagraphe AS T2  
     WHERE T2.iddoc = T.iddoc
)  
ORDER BY T.date DESC LIMIT 5


Merci pour ta participation ;)
 
[EDIT]
Finalement ça repart en cacahuète dès que j'ajoute un nouveau champ issu d'une autre table :'(
 
Je veux à présent, en me basant sur la requête précédent qui marche, récupérer le titre du document auquel le paragraphe est rattaché :
 

SELECT T.idpara, T.iddoc, T.date, P.titre  
FROM TParagraphe AS T, TDocument AS P  
WHERE P.public = 1  
AND T.iddoc = P.iddoc
AND T.date =  
(
    SELECT MAX(T2.date)  
    FROM TParagraphe AS T2  
    WHERE T2.iddoc = T.iddoc
)  
ORDER BY T.date DESC LIMIT 5


Là ça repart sur des requêtes qui durent plus de 25 secondes à s'exécuter :'(


Message édité par Inekman le 07-09-2006 à 23:12:00
Reply

Marsh Posté le 08-09-2006 à 15:38:04    

Je n'ai pas le temps de te faire la requête propre, mais tu pourrais essayer un truc du style :
 

Code :
  1. SELECT id_para, id_doc, date, titre
  2. FROM Para, Doc
  3. WHERE (id_doc, date) IN
  4. (SELECT id_doc, MAX(date)
  5. FROM Para
  6. GROUP BY id_doc)
  7. AND Para.id_doc = Doc.id_doc


 
Je n'ai pas vérifié que le résultat attendu était le bon mais je pense que oui et ça te fera très certainement gagner du temps car tu n'auras plus d'appel à ta premiere requete dans ta sous requete ;) !


Message édité par darkfrost le 08-09-2006 à 15:38:57
Reply

Marsh Posté le 08-09-2006 à 15:49:34    

Salut darkfrost, merci beaucoup pour ta participation.
 
Je viens de trouver une solution alternative qui répond finalement mieux à mon besoin. Plutôt que de prendre les paragraphes les plus récents et de retrouver les documents associés, j'ai pris le problème à l'envers et ça marche bien comme ça. Je prend les documents et pour chacun d'eux, je récupère le paragraphe le plus récent et voili.
 
Big merci à vous deux en tout cas.
 
PS : d'autant plus que chez moi les sous-requêtes fonctionnent, mais là où la page va être publiée ça marche pas (MySQL too old).


Message édité par Inekman le 08-09-2006 à 15:50:26
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed