[PHP/MySql] Comment faire cette requete ?

Comment faire cette requete ? [PHP/MySql] - PHP - Programmation

Marsh Posté le 30-10-2003 à 01:50:50    

Salut,
Pour apprendre PHP (et pour etre original :D ) , j'ai decidé de faire un forum. Il est sur le point d'etre fini mais il me manque un truc.
 
Voici mon probleme:
Comment afficher les "sujets" dans l'ordre des dernieres reponses a ces "sujets" (comme sur tous les forums koi!)
J'ai les sujets et les reponses dans la meme BDD avec un champs "idSujet"(pour les reponses) qui donne l'id du sujet, et un champs "date".
 
Comment fait-on ca???  
Est-il possible de faire une requete sur un resultat de requete?
Est-il possible de faire ca en une seul requete?
 
Merci :jap:

Reply

Marsh Posté le 30-10-2003 à 01:50:50   

Reply

Marsh Posté le 30-10-2003 à 03:18:50    

le plus simple est p-e de rajouter une colonne "DATE_DU_DERNIER_POST" dans ta table qui stocke les sujets  et quand tu inseres un nouveau message dans un topic , tu update cette nouvelle colonne...
et ensuite lorsque tu affiches la liste des sujets, tu tries par DATE_DU_DERNIER_POST decroissant...

Reply

Marsh Posté le 30-10-2003 à 13:43:42    

Un truc du style ?
 
SELECT sujet.nom,MAX(date) as DATE_DU_DERNIER_POST FROM sujet,reponse WHERE sujet.id=reponse.idsujet ORDER BY DATE_DU_DERNIER_POST

Reply

Marsh Posté le 30-10-2003 à 14:20:24    

Merci de vos reponse :jap:  
Je voudrais essayer de faire ca sans rajouter de champs.
Ca doit etre possible pour quelqu'un qui maitrise mysql (ce qui n'est pas mon cas, car debutant)
 
Je vous balance mon code qui m'affiche les sujets mais sans tenir compte des derniers messages(ce qui est le probleme).  
Si vous pouvez, par la meme occasion, m'optimiser tout ca en me disant sur quel champs mettre un index!(j'en demande peut-etre beaucoup  :ange: )
 

Code :
  1. //requete me donnant les X derniers sujets
  2. $resultat=mysql_query("SELECT `id`, `sujet` ,`pseudo` ,`datePost` FROM `message` WHERE 1 AND `idForum`= {$_GET['f']} AND `idSujet`=0 ORDER BY `id` DESC" );
  3. while($sujet = mysql_fetch_array($resultat))
  4. {  //requete pour le nombre de reponse a ce sujet
  5. $resultat2 = mysql_query("SELECT COUNT(*) FROM `message` WHERE `idForum` = {$_GET['f']} AND `idSujet`= $sujet[0]" );
  6. $nombrePost = mysql_fetch_row($resultat2);
  7.         //requete pour la date du dernier post  
  8. $resultat3 = mysql_query ("SELECT `pseudo` , `datePost` FROM `message` WHERE `idForum` = {$_GET['f']} AND (`idSujet`= $sujet[0] OR `id`= $sujet[0]) ORDER BY `id` DESC  LIMIT 0,1" );
  9. $dernierPost = mysql_fetch_array($resultat3);
  10. }


 
Merci de vos conseils

Reply

Marsh Posté le 30-10-2003 à 14:26:48    

l'ID du post est logiquement croissant. Donc pas besoin de se baser sur la date, mais l'ID du post. En plus ce sera beaucoup plus rapide, puisque ce champ est composante d'un index unique trié.

Reply

Marsh Posté le 30-10-2003 à 14:48:22    

1° Ok, je me base le plus possible sur les "id" car plus rapide. Ai-je besoin de mettre ORDER BY `id` DESC a la fin de ma requete?
 
2°J'arrive tjs pas a faire cette requete qui me permet de trié les sujets dans l'ordre des dernieres reponses (ca fait au moins 10h que je bloque la dessus :pt1cable: SOS :cry: )

Reply

Marsh Posté le 30-10-2003 à 15:30:56    

oui, sinon ça sera pas trié (ou alors, dans l'ordre ASC - ordre d'insertion des lignes dans la table... et dans tous les cas, il ne faut jamais faire confiance à l'ordre d'insertion, donc TOUJOURS utiliser un ORDER BY - surtout que ça change rien à la rapidité -)

Reply

Marsh Posté le 30-10-2003 à 16:06:02    

MagicBuzz a écrit :

oui, sinon ça sera pas trié (ou alors, dans l'ordre ASC - ordre d'insertion des lignes dans la table... et dans tous les cas, il ne faut jamais faire confiance à l'ordre d'insertion, donc TOUJOURS utiliser un ORDER BY - surtout que ça change rien à la rapidité -)
 


Merci pour c renseignements Magic (ca confirme ce que je pensais)
 
 

kikiops a écrit :


2°J'arrive tjs pas a faire cette requete qui me permet de trié les sujets dans l'ordre des dernieres reponses (ca fait au moins 10h que je bloque la dessus :pt1cable: SOS :cry: )


 
Bon ben je crois bien qu'il va faloir que je me tape les 300 pages de la doc mySql ! :cry:


Message édité par kikiops le 30-10-2003 à 16:58:21
Reply

Marsh Posté le 30-10-2003 à 17:55:53    

ha oki ...
tu n'a qu'une table qui contient à la fois les sujets et les réponse en fait...
regarde donc du côté de GROUP BY tu devrais trouver quelque chose qui te convient ... paske là j'ai pas trop le temps de te faire la requete.
 
Demain peut être =)

Reply

Marsh Posté le 30-10-2003 à 19:02:05    

quelle est la structure de ta(tes) table(s) ?
 
parceque sans ça, je vois pas comment on pourrait t'aider.
 
mais sinon, clairement, ça se jouera certainement à coup de max sur l'id des réponses, avec un group by sur l'id des topics.

Reply

Marsh Posté le 30-10-2003 à 19:02:05   

Reply

Marsh Posté le 30-10-2003 à 19:13:19    

Azzazel, c ca, j'ai une seul table.
Merci  pour le tuyau! J'epluche la doc pour voir ce que sont ces GROUP BY!
 
Voici la table toute simple:  
id  idForum  idSujet  pseudo  sujet  message  datePost  
Merci Magic


Message édité par kikiops le 30-10-2003 à 19:17:54
Reply

Marsh Posté le 30-10-2003 à 19:32:58    

hô putain. ok, je vois ton truc... ben t'es pas dans la merde...
 
en effet, je suppose que :
-> pseudo, c'est le pseudo de celui qui a posté la ligne ? et tu veux afficher le dernier ?
-> sujet, c'est tout le temps vide sauf pour le premier post d'un topic ?
 
tu aurais dû tout foutre dans un seule champs ça aurait pas été plus chiant à gérer... ;)
 
bon, je me lance (par contre, y'auras 25 fautes dans la requête, j'ai rien pour tester)

Reply

Marsh Posté le 30-10-2003 à 19:44:37    

select t1.sujet, t1.pseudo, t1.datepost, t2.pseudo, t2.datepost
from tab t1, tab t2
where t1.sujet is not null
and t2.idsujet = t1.idsujet
and t2.id in (select max(id)
              from tab
              group by idsujet)
order by t2.id desc


 
 
si tas version de MySQL accepte les requêtes imbriquée, alors ça devrait marcher.
par contre ça sera pas performant du tout.
 
en deux passes (plus performant si tu as beaucoup de lignes dans la table) ça donnera un truc du genre :
 


select max(id) last
from tab
group by idsujet
order by last limit 0, 20
 
while (!fin_des_donnes)
{
   select t1.sujet, t1.pseudo, t1.datepost, t2.pseudo, t2.datepost
   from tab t1, tab t2
   where t1.sujet is not null
   and t2.idsujet = t1.idsujet
   and t2.id = $last
}


 
Mais bon, ça serait quand même plus propre si tu avais deux tables, une pour les topic (ne contenant que le sujet), et une pour les posts (contenant le premier message du topic)
 
A ce moment une requête en une seule passe serait suffisante et bien plus performante.


Message édité par MagicBuzz le 30-10-2003 à 19:45:51
Reply

Marsh Posté le 30-10-2003 à 22:03:51    

Mille merci et bravo :love:  
 
Ben la j'ai du boulot a comprendre tout ca!
 
je ne comprends pas trop max(id) last !
"last" est une variable? si c ca j'savais meme pas que ct possible dans les requetes!
 
Encore merci
 

Reply

Marsh Posté le 30-10-2003 à 22:10:54    

last est juste un alias que j'ai donné à max(id) parceque sinon le champ n'a pas de nom, et c'est pas très pratique pour l'utiliser ensuite. tu peux mettre "max(id) as last" si tu préfères. Le AS est normalement facultatif.

Reply

Marsh Posté le 30-10-2003 à 22:52:59    

Oki pour c nouvelles expliquations, j'ai capté le principe, je suis dans les docs pour comprendre tous ca... Merci de ton coup main  :jap:

Reply

Sujets relatifs:

Leave a Replay

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