[Sql] Trier une requete par une autre ?

Trier une requete par une autre ? [Sql] - SQL/NoSQL - Programmation

Marsh Posté le 10-08-2004 à 11:45:46    

Bonjour,
 
J'ai parcouru le forum à la recherche de ma solution mais je n'ai pas trouvé donc je poste ce message.
 
En gros je voudrais trier un resultat de requete par une requete
 
REQUETE 1
select auteur_message, nom_site, date_message
from message_forum, site
where mes_id_message is null      
and no_site = site_message
order by REQUETE 2
 
REQUETE 2
select date_message
from message_forum
where mes_id_message is not null
and no_site = site_message
order by date_message desc
 
J'ai essayé pas mal de truc et jamais le bon resultat.
 
Merci d'avance.

Reply

Marsh Posté le 10-08-2004 à 11:45:46   

Reply

Marsh Posté le 10-08-2004 à 15:50:18    

Pourquoi ne pas faire directement :
 
SELECT auteur_message, nom_site, date_message  
FROM message_forum, site  
WHERE site.no_site = message_forum.site_message  
AND site_message.mes_id_message IS NULL  
ORDER BY message_forum.date_message desc  
 
??
 
Sinon précise ce que tu veux ressortir de tes 2 tables, et sur quoi tu veux les trier stp.
 

Reply

Marsh Posté le 10-08-2004 à 15:56:10    

En fait, je voudrais trier par date_message mais de la 2eme requete.
 
Le but etant de lister le sujet principale de la requete et ensuite les reponses associés et que tout celà soit trié en fonction de la dernière réponse exactement comme un forum.
 
J'ai essayé :
select sujet_message, corps_message, auteur_message, nom_site, convert(char(12), message_forum.date_message, 103) date, convert(char(5), message_forum.date_message, 8) heure  
from message_forum, site, (select message_forum.date_message as date_message from message_forum where sujet_message is null) req1  
where id_message < 219 and id_forum = '9' and mes_id_message is null      
and no_site = site_message
order by req1.date_message desc
 
Mais ça n'a pas l'air de fonctionner non plus :(
 
Merci.

Reply

Marsh Posté le 10-08-2004 à 16:11:12    

Et ça ?
 
SELECT auteur_message, nom_site, date_message  
FROM message_forum, site  
WHERE site.no_site = message_forum.site_message  
AND site_message.mes_id_message IS NULL  
ORDER BY auteur_message ASC, message_forum.date_message desc  

Reply

Marsh Posté le 10-08-2004 à 16:12:59    

Il faut que tu utilise des alias je pense à un truc du genre :
 
SELECT *
FROM message_forum TOPIC, message_forum REPONSE, site  
WHERE site.no_site = TOPIC.site_message  
AND TOPIC.id_message = REPONSE.id_message  
AND TOPIC.mes_id_message IS NULL  
AND ...
ORDER BY REPONSE.date_message desc  
 
Tu fait comme si tu avait 3 tables, SITE, TOPIC et MESSAGE
Tu fait tes jointures pour avoir un TOPIC avec le SITE et les MESSAGE qui lui sont associés.
Tu rajoute dans le Where les clauses qui vont bien pour ne récupérer que ce qui t'intéresse.
 

Reply

Marsh Posté le 10-08-2004 à 16:13:02    

Enfin bref ... il faut dans ton cas, trier sur plusieurs
colonnes et pas que sur une ...

Reply

Marsh Posté le 10-08-2004 à 16:25:46    

Comme j'ai pas tout compris, désolé :(
 
Je mets le "schéma" de ma base
 
Oublions la table SITE, voici la table MESSAGE_FORUM
 
ID_MESSAGE | ID_FORUM | MES_ID_MESSAGE | SUJET_MESSAGE | CORPS_MESSAGE | DATE_MESSAGE
 
Merci encore pour votre aide, je vais quand meme essayé de voir dans mon coin avec les réponses du dessus :)

Reply

Marsh Posté le 10-08-2004 à 16:31:03    

peux tu décrire les champs ID_MESSAGE et MES_ID_MESSAGE stp
 
En gros est-ce que MES_ID_MESSAGE contient l'ID du sujet principale ?

Reply

Marsh Posté le 10-08-2004 à 16:31:32    

ID_MESSAGE est juste un identifiant, MES_ID_MESSAGE est NULL lorsqu'il s'agit du sujet et SUJET_MESSAGE lorsqu'il s'agit d'une réponse.
 
Et donc oui MES_ID_MESSAGE contient l'identifiant du sujet.


Message édité par Slash2012 le 10-08-2004 à 16:33:07
Reply

Marsh Posté le 10-08-2004 à 16:39:14    

Regarde ce que ca te donne ca :
 
SELECT *  
FROM message_forum SUJET, message_forum REPONSE    
WHERE SUJET.id_message = REPONSE.mes_id_message  
AND SUJET.mes_id_message IS NULL    
AND REPONSE.sujet_message IS NULL
ORDER BY REPONSE.date_message desc    
 

Reply

Marsh Posté le 10-08-2004 à 16:39:14   

Reply

Marsh Posté le 10-08-2004 à 16:50:49    

Ca à l'air de marche maintenant il me reste plus qu'a l'integrer avec tout ce que j'ai pu epurer.
 
C'est jamais evident de reprendre un projet en cours... surtout quand on ne l'a pas suivi du début à la fin et que c'est pas super bien conçu.
 
En tout cas merci beaucoup !! En esperant que j'arrive à m'en sortir pour la fin !

Reply

Marsh Posté le 10-08-2004 à 17:02:51    

Bon décidement, je dois pas avoir de chance, je n'arrive pas à integrér la requete dans l'existant. Je crois que je vais refaire le script parcque c'est la daube. La reprise de projet que c'est dur ;) !!!
 
Merci encore !

Reply

Marsh Posté le 10-08-2004 à 17:08:57    

Je crois bien que je viens de reussir !!!
MERCI MERCI MERCI !!!!

Reply

Marsh Posté le 10-08-2004 à 17:37:20    

J'ai modifié ma requete mais en fait ca ne fonctionne pas, j'obtiens plusieurs fois le meme sujet.
 
   'SELECT top ' +  @sNbSujets + ' SUJET.id_message, SUJET.sujet_message, SUJET.corps_message, SUJET.auteur_message, site.nom_site, convert(char(12), SUJET.date_message, 103) date, convert(char(5), SUJET.date_message, 8) heure  
   FROM message_forum as SUJET, message_forum as REPONSE, site    
   WHERE SUJET.id_message = REPONSE.mes_id_message  
   AND SUJET.id_message < ' + @sNumMsgDepart + '
   AND SUJET.id_forum = ' + @sNumForum + '
   AND SUJET.mes_id_message IS NULL    
   AND REPONSE.mes_id_message IS NOT NULL
   AND SITE.no_site = SUJET.site_message  
   ORDER BY REPONSE.date_message desc'

Reply

Marsh Posté le 10-08-2004 à 17:44:40    

Normalement la requête que tu viens de poster doit te retourner toutes les réponses.
Tu ne récupèreras pas les sujets sans réponses puisque tu fais une jointure exacte (SUJET.id_message = REPONSE.mes_id_message).
 
Si c'est bien les réponses que tu veux, remplace les SUJET de la clause SELECT par des REPONSE

Reply

Marsh Posté le 10-08-2004 à 17:50:08    

Bah en fait ce que j'obtiens c'est les sujets suivis de leurs reponses, jusqu'à la tout va bien mais un moment le il y a repetition de sujet. C'est dommage car le tri par date fonctionne bien... :(

Reply

Marsh Posté le 10-08-2004 à 17:58:05    

Bon je reprendrai ça demain la je suis en train de me perdre. Demain sera un autre jour !
 
En tout cas, merci beaucoup ! :D

Reply

Marsh Posté le 11-08-2004 à 16:45:17    

Bon ma dernière version de requete est :
 
   'SELECT top ' +  @sNbSujets + ' SUJET.id_message, SUJET.sujet_message, SUJET.corps_message, SUJET.auteur_message, site.nom_site, convert(char(12), SUJET.date_message, 103) date, convert(char(5), SUJET.date_message, 8) heure  
   FROM message_forum as SUJET, message_forum as REPONSE, site    
   WHERE SUJET.id_message = REPONSE.mes_id_message  
   AND SUJET.id_message < ' + @sNumMsgDepart + '
   AND SUJET.id_forum = ' + @sNumForum + '
   AND SUJET.mes_id_message IS NULL    
   AND REPONSE.mes_id_message IS NOT NULL
   AND SITE.no_site = SUJET.site_message  
   ORDER BY REPONSE.date_message desc'
 
Et ça marche toujours pas, je ne comprends vraiment pas... HELP ME PLEASE !!! Je commence à croire que c'est moi qui déconne completement non ?
 
Merci d'avance.

Reply

Marsh Posté le 11-08-2004 à 16:47:26    

Ca me recupère bien le sujet avec ses réponses associées avec un semblant de tri mais quand j'effectue ma boucle il me repete des sujets et les reponses qui vont avec... :(

Reply

Marsh Posté le 11-08-2004 à 17:29:28    

Ben si t'as plusieurs fois le même sujet fait un SELECT DISTINCT non ?

Reply

Marsh Posté le 11-08-2004 à 17:37:24    

tu pourrais mettre le résultat de la requête pour 1 sujet et ses réponses stp, accompagné des lignes qui correspondent dans la base ?
 

Citation :

...mais quand j'effectue ma boucle...


 
Quelle boucle ? :??:


Message édité par -Farenheit- le 11-08-2004 à 17:37:46
Reply

Marsh Posté le 11-08-2004 à 18:07:02    

Glod 2 : J'ai pensé aussi à un DISTINCT mais il me fait une erreur comme quoi je dois mettre le truc dans le ORDER BY. De plus, je ne sais pas si le tri par date de réponses marchera après... :(
 
Farenheit : Oublions la boucle (contenu dans un fichier ASP qui appel la requete) car je ne pense pas qu'elle soit en cause. Pour le résultat, si je prends le sujet 1, il est bien accompagné de ses réponses et bien trié, il figure en premier.

Reply

Marsh Posté le 11-08-2004 à 19:10:33    

Y a un truc que je comprends pas trop ...
 
tu veux avoir la liste des SUJETS uniquement, triés par date de dernier message, c'est bien ça ? :)
 
Tu utilises mySql ?

Reply

Marsh Posté le 11-08-2004 à 22:35:01    

Vu la syntaxe du convert, c'est SQL Server.
 
Donc :
 
select sujet.auteur_message, site.nom_site, sujet.date_message, post.date_message
from message_forum post, message_forum sujet, site
where sujet.mes_id_message is null      
and site.no_site = sujet.site_message
and post.mes_id_message = sujet.id_message
where post.date_message = (select max(post2.date_message) from message_forum post2 where post2.mes_id_message = sujet.id_message)
order by post.date_message
 
Normalement ça doit marcher.


Message édité par Arjuna le 11-08-2004 à 22:37:44
Reply

Marsh Posté le 11-08-2004 à 22:36:53    

Sinon, plus simple en fait... (par contre, à cause du group by, je ne sais pas si c'est plus rapide)
 
select sujet.auteur_message, site.nom_site, sujet.date_message, max(post.date_message)
from message_forum post, message_forum sujet, site
where sujet.mes_id_message is null      
and site.no_site = sujet.site_message
and post.mes_id_message = sujet.id_message
group by sujet.auteur_message, site.nom_site, sujet.date_message
order by 4


Message édité par Arjuna le 11-08-2004 à 22:38:26
Reply

Marsh Posté le 12-08-2004 à 11:17:11    

Je veux avoir la liste des sujets + les reponses correspondantes triés pas date de dernière réponse.
 
Le projet qu'on vient de me refiler est un forum développé en ASP sous SQL SERVER avec procédures stockées.
 
Je suis en train de tester tes requetes Arjuna... Merci

Reply

Marsh Posté le 12-08-2004 à 11:23:24    

Je vais effectuer quelques tests mais ça à l'air de fonctionner avec :
 

Citation :


   'select top ' +  @sNbSujets + ' sujet.id_message, sujet.auteur_message, site.nom_site, sujet.date_message, post.date_message  
   from message_forum as post, message_forum as sujet, site  
   where sujet.mes_id_message is null        
   and site.no_site = sujet.site_message  
   and post.mes_id_message = sujet.id_message  
   and sujet.id_message < ' + @sNumMsgDepart + '
   and sujet.id_forum =  ' + @sNumForum + '
   and post.date_message = (select max(post2.date_message) from message_forum as post2 where post2.mes_id_message = sujet.id_message)  
   order by post.date_message desc'


 
Si je vois que ca deconne je reviendrai vous demander de l'aide !! ;)
En tout cas, si on ne se recroise pas merci beaucoup !! C'etait hyper important !

Reply

Marsh Posté le 13-08-2004 à 11:01:46    

Et oui c'est encore moi vraiment désolé !! Le tri sur les résultats semble fonctionner par contre je n'obtiens pas tous les sujets. Est ce du à la jointure "and post.mes_id_message = sujet.id_message" qui ne prend que les sujets ayant des réponses ?
 
Merci


Message édité par Slash2012 le 13-08-2004 à 11:02:01
Reply

Marsh Posté le 13-08-2004 à 11:11:21    

fais une jointure externe ...
 
je connais pas la syntaxe de SQL server ;)

Reply

Marsh Posté le 13-08-2004 à 11:14:06    

ok je vais essayé de trouver merci bien :)
Faut pas que je foire tout en essayant des syntaxes de fou !! :D


Message édité par Slash2012 le 13-08-2004 à 11:19:51
Reply

Marsh Posté le 13-08-2004 à 11:57:09    

Syntaxe Sql Server pour récupérer tous les chp1
de la tablea  
avec ou sans chp2 pour tableb
=>  
select tablea.chp1, tableb.chp2
from tablea left join tableb
 on  tablea.chp1 = tableb.chp1
 

Reply

Marsh Posté le 13-08-2004 à 13:57:35    

Bon la je suis vraiment doué donc je remets ma requete parcque ca ne recupére toujours pas les sujets sans réponse :(
 

Citation :


   'select top ' +  @sNbSujets + ' SUJET.id_message, SUJET.sujet_message, SUJET.corps_message, SUJET.auteur_message, site.nom_site, convert(char(12), SUJET.date_message, 103) date, convert(char(5), SUJET.date_message, 8) heure
   from site, message_forum as post left join message_forum as sujet on post.mes_id_message = sujet.id_message  
 
   where sujet.mes_id_message is null        
   and site.no_site = sujet.site_message  
 
   and sujet.id_message < ' + @sNumMsgDepart + '
   and sujet.id_forum =  ' + @sNumForum + '
   and post.date_message = (select max(post2.date_message) from message_forum as post2 where post2.mes_id_message = sujet.id_message)  
   order by post.date_message desc'

Reply

Marsh Posté le 13-08-2004 à 14:08:51    

:non: la tu récupère les messages sans sujet...  
 
essaye comme ca :

Citation :


'select top ' +  @sNbSujets + ' SUJET.id_message, SUJET.sujet_message, SUJET.corps_message, SUJET.auteur_message, site.nom_site, convert(char(12), SUJET.date_message, 103) date, convert(char(5), SUJET.date_message, 8) heure  
  from site, message_forum as sujet left join message_forum as post on post.mes_id_message = sujet.id_message  
 
  where sujet.mes_id_message is null        
  and site.no_site = sujet.site_message  
 
  and sujet.id_message < ' + @sNumMsgDepart + '  
  and sujet.id_forum =  ' + @sNumForum + '  
  and post.date_message = (select max(post2.date_message) from message_forum as post2 where post2.mes_id_message = sujet.id_message)  
  order by post.date_message desc'  


Message édité par -Farenheit- le 13-08-2004 à 14:09:38
Reply

Marsh Posté le 13-08-2004 à 14:18:12    

Toujours rien :(
 
J'ai même essayé :
 
from site, message_forum as sujet left join message_forum as post on sujet.id_message = post.mes_id_message

Reply

Marsh Posté le 13-08-2004 à 14:35:26    

et si tu vire la clause

Citation :

and post.date_message = (select max(post2.date_message) from message_forum as post2 where post2.mes_id_message = sujet.id_message)


 


Message édité par -Farenheit- le 13-08-2004 à 14:40:35
Reply

Marsh Posté le 13-08-2004 à 14:39:05    

alleluia !! Peux tu m'expliquer si ca ne te derange pas (j'ai tellement emmerdé le monde avec ma requete !!) ?
 
Parcqu'en fait je pensais que le truc qu'on a viré servait au tri par date...

Reply

Marsh Posté le 13-08-2004 à 14:41:29    

Non en fait ca marche pas, ca repete les sujets...:(

Reply

Marsh Posté le 13-08-2004 à 14:42:33    

Et ca ?
 
'select top ' +  @sNbSujets + ' SUJET.id_message, SUJET.sujet_message, SUJET.corps_message, SUJET.auteur_message, site.nom_site, convert(char(12), SUJET.date_message, 103) date, convert(char(5), SUJET.date_message, 8) heure  
 from site, message_forum as sujet left join message_forum as post on post.mes_id_message = sujet.id_message    
 
 where sujet.mes_id_message is null          
 and site.no_site = sujet.site_message    
 
 and sujet.id_message < ' + @sNumMsgDepart + '  
 and sujet.id_forum =  ' + @sNumForum + '  
 and (
post.date_message = (select max(post2.date_message) from message_forum as post2 where post2.mes_id_message = sujet.id_message)  
OR
 post.date_message Is Null
     )    
 order by post.date_message desc'

Reply

Marsh Posté le 13-08-2004 à 14:46:58    

Là ça à l'air de fonctionnern j'ai juste encore un petit soucis de tri par date des sujets qui n'ont pas de réponses mais ca vient peut etre de ma base et je pense que je pourrai me débrouiller sur ce coup...
 
En tout cas encore un grand merci à tout ceux qui ont participé à ce sujet !
 
I'll be back ;)
 
Ps : Si y'a des personnes pour m'expliquer un peu le résultat final, je ne suis pas contre ;)


Message édité par Slash2012 le 13-08-2004 à 14:48:35
Reply

Marsh Posté le 13-08-2004 à 18:38:06    

Slash2012 a écrit :

Et oui c'est encore moi vraiment désolé !! Le tri sur les résultats semble fonctionner par contre je n'obtiens pas tous les sujets. Est ce du à la jointure "and post.mes_id_message = sujet.id_message" qui ne prend que les sujets ayant des réponses ?
 
Merci


 
explicite tes jointures et fous la en externe :
 
"left outer join post P on P.mes_id_message = sujet.id_message"
 
au lieu du "from post"


---------------
Hobby eien /人◕ ‿‿ ◕人\
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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