Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2918 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  [PHP/MySql] Comment faire cette requete ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[PHP/MySql] Comment faire cette requete ?

n°554117
kikiops
Posté le 30-10-2003 à 01:50:50  profilanswer
 

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:

mood
Publicité
Posté le 30-10-2003 à 01:50:50  profilanswer
 

n°554120
JWhy
je peux plier (héhé)
Posté le 30-10-2003 à 03:18:50  profilanswer
 

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...

n°554458
Azzazel
Posté le 30-10-2003 à 13:43:42  profilanswer
 

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

n°554490
kikiops
Posté le 30-10-2003 à 14:20:24  profilanswer
 

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

n°554495
MagicBuzz
Posté le 30-10-2003 à 14:26:48  profilanswer
 

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é.

n°554512
kikiops
Posté le 30-10-2003 à 14:48:22  profilanswer
 

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: )

n°554573
MagicBuzz
Posté le 30-10-2003 à 15:30:56  profilanswer
 

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é -)

n°554614
kikiops
Posté le 30-10-2003 à 16:06:02  profilanswer
 

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
n°554824
Azzazel
Posté le 30-10-2003 à 17:55:53  profilanswer
 

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 =)

n°554855
MagicBuzz
Posté le 30-10-2003 à 19:02:05  profilanswer
 

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.

mood
Publicité
Posté le 30-10-2003 à 19:02:05  profilanswer
 

n°554858
kikiops
Posté le 30-10-2003 à 19:13:19  profilanswer
 

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
n°554865
MagicBuzz
Posté le 30-10-2003 à 19:32:58  profilanswer
 

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)

n°554876
MagicBuzz
Posté le 30-10-2003 à 19:44:37  profilanswer
 

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
n°554980
kikiops
Posté le 30-10-2003 à 22:03:51  profilanswer
 

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
 

n°554995
MagicBuzz
Posté le 30-10-2003 à 22:10:54  profilanswer
 

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.

n°555044
kikiops
Posté le 30-10-2003 à 22:52:59  profilanswer
 

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:


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  [PHP/MySql] Comment faire cette requete ?

 

Sujets relatifs
[ PHP / MySQL ] requête de base ; résultat bizarre ...[Php/MySQL] Bp retour à la ligne sur resultat requete
[PHP/mysql] lancer une requete avec un bouton ...[PHP] Amélioration de requete PHP/MySQL
[MySQL] et PHP : avoir le resultat d 1 requete MySQL avec php. ?[PHP // MySQL] Récup du résultat d'une requete sous forme d'array
Problème requête MySql avec un ";" dedans (un peu de PHP aussi)[PHP] Récupération d'une variable d'un formulaire ds une requête MySQL
PHP/MySQL : comment faire une requète sur deux bases ?[ca marche][PHP] Requête MySQL ds une fonction, ça marche po :( je comprends po !
Plus de sujets relatifs à : [PHP/MySql] Comment faire cette requete ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR