Trier une requete par une autre ? [Sql] - SQL/NoSQL - Programmation
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.
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.
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
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.
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 ...
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
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 ?
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.
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
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 !
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 !
Marsh Posté le 10-08-2004 à 17:08:57
Je crois bien que je viens de reussir !!!
MERCI MERCI MERCI !!!!
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'
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
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...
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 !
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.
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...
Marsh Posté le 11-08-2004 à 17:29:28
Ben si t'as plusieurs fois le même sujet fait un SELECT DISTINCT non ?
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 ?
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.
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 ?
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.
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
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
Marsh Posté le 12-08-2004 à 11:23:24
Je vais effectuer quelques tests mais ça à l'air de fonctionner avec :
Citation : |
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 !
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
Marsh Posté le 13-08-2004 à 11:11:21
fais une jointure externe ...
je connais pas la syntaxe de SQL server
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 !!
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
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 : |
Marsh Posté le 13-08-2004 à 14:08:51
la tu récupère les messages sans sujet...
essaye comme ca :
Citation : |
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
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) |
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...
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'
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
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 ? |
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"
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.