[SQL] Comment inverser le résultat d'une requête?[réglé]

Comment inverser le résultat d'une requête?[réglé] [SQL] - PHP - Programmation

Marsh Posté le 06-07-2003 à 18:07:10    

Bon, il s'agit d'une requête pour le forum phpbb;
Quand on clique sur répondre à un message, on voti les précédents posts en dessous de la fenêtre de réponse, mais il sont dans l'ordre descendant. Or je voudrais dans l'ordre ascendant, et uniquement le nombre de post qui étaient présent sur la page pour faire propre !
 
Je suis arrivé à faire une modif pour avoir le bon nombre de posts, et les bon posts en plus, mais il s'affichent en ordre inversé. Comment faire ?
Merci d'avance !  
 
 

Code :
  1. // Ma modif pour récupérer le bon nombre de posts
  2. $sql = "SELECT topic_replies
  3. FROM " . TOPICS_TABLE . "
  4. WHERE topic_id = $topic_id";
  5. if ( !($result = $db->sql_query($sql)) )
  6. {
  7.  message_die(GENERAL_ERROR, 'Could not obtain post/user information', '', __LINE__, __FILE__, $sql);
  8. }
  9. if ( $row = $db->sql_fetchrow($result) )
  10. {
  11. $reste =  ($row['topic_replies']+1) % $board_config['posts_per_page']; // reste de la division du mombre de posts dans le topic par le nombre de posts par page
  12. }
  13. //fin ma modif
  14. $sql = "SELECT u.username, u.user_id, p.*,  pt.post_text, pt.bbcode_uid
  15.  FROM " . POSTS_TABLE . " p, " . USERS_TABLE . " u, " . POSTS_TEXT_TABLE . " pt
  16.  WHERE p.topic_id = $topic_id
  17.   AND p.poster_id = u.user_id
  18.   AND p.post_id = pt.post_id
  19.  ORDER BY p.post_time DESC
  20.  LIMIT $reste";
  21. if ( !($result = $db->sql_query($sql)) )
  22. {
  23.  message_die(GENERAL_ERROR, 'Could not obtain post/user information', '', __LINE__, __FILE__, $sql);
  24. }
  25. //
  26. // Okay, let's do the loop, yeah come on baby let's do the loop
  27. // and it goes like this ...
  28. //
  29. if ( $row = $db->sql_fetchrow($result) )
  30. {
  31.  $i = 0;
  32.  do
  33.  {
  34.                   ........ // récupère les données de chaque post


 
En fait c'est pour arriver au même résultat que sur ce forum..


Message édité par xofred le 06-07-2003 à 19:24:18
Reply

Marsh Posté le 06-07-2003 à 18:07:10   

Reply

Marsh Posté le 06-07-2003 à 18:13:54    

Quand tu fais un tri, tu peux indiquer le sens
... ORDER BY colonne1 ASC, colonne2 DESC

Reply

Marsh Posté le 06-07-2003 à 18:17:10    

Oui, il y a ça :

Code :
  1. ORDER BY p.post_time DESC


 
Je suis obligé ( me semble-t'il) de rester en descendant pour avoir par exemple les 4 derniers posts sur 10 dans le temps...
 
Ils seront donc dans l'ordre du plus récent au plus ancien...  
Mais je voudrais les afficher du plus ancien au plus récent!
   

Reply

Marsh Posté le 06-07-2003 à 18:21:22    

Ah, d'accord.
Là, il faudra surement bidouiller quelque chose en PHP. Par exemple, construire le html correspondant à chaque post dans une variable et faire un echo de ces variables dans l'ordre inverse.

Reply

Marsh Posté le 06-07-2003 à 18:22:41    

mrBebert a écrit :

Ah, d'accord.
Là, il faudra surement bidouiller quelque chose en PHP. Par exemple, construire le html correspondant à chaque post dans une variable et faire un echo de ces variables dans l'ordre inverse.


Ok... je vais essayer de trouver ! Merci.

Reply

Marsh Posté le 06-07-2003 à 18:24:11    

Et dans cette fonction qui affiche dans l'ordre, il n'y en a pas une autre qui affiche dans l'ordre inverse ?
if ( $row = $db->sql_fetchrow($result) )...

Reply

Marsh Posté le 06-07-2003 à 18:29:51    

Pas à ma connaissance. Sinon, tu as toujours la possibilité d'utiliser la fonction mysql_result() :/

Reply

Marsh Posté le 06-07-2003 à 19:25:42    

OK, c'est réglé gràce à LIMIT :
Je savais pas qu'on pouvait mettre par ex : LIMIT 15,30  ce qui permet de ne garder que les résultats de 15 à 30 !
J'ai donc pu laisser en ascendant grâce à cette fonction
Et voilà ! :)


Message édité par xofred le 06-07-2003 à 19:26:24
Reply

Marsh Posté le 06-07-2003 à 19:28:31    

Tiens oui, j'avais pas vu que tu récupérais d'abord le nombre total de posts :pt1cable:

Reply

Marsh Posté le 06-07-2003 à 19:36:38    

Voilà le code au final. Je me demande comment n'en faire qu'une requête au lieu de 2 ! Sachant qu'il y a besoin des résultats de la 1ère pour obtenir $depart et $fin, nécéssaire à la 2ème ! :pt1cable:  
 

Code :
  1. // Ma modif
  2. $sql = "SELECT topic_replies
  3. FROM " . TOPICS_TABLE . "
  4. WHERE topic_id = $topic_id";
  5. if ( !($result = $db->sql_query($sql)) )
  6. {
  7.  message_die(GENERAL_ERROR, 'Could not obtain post/user information', '', __LINE__, __FILE__, $sql);
  8. }
  9. if ( $row = $db->sql_fetchrow($result) )
  10. {
  11. $fin = $row['topic_replies']; //nombre total de posts dans ce topic
  12. $depart = $fin - ($fin % $board_config['posts_per_page']);  // reste de la division du mombre de posts dans le topic par le nombre de posts par page
  13. }
  14. //fin ma modif
  15. $sql = "SELECT u.username, u.user_id, p.*,  pt.post_text, pt.bbcode_uid
  16.  FROM " . POSTS_TABLE . " p, " . USERS_TABLE . " u, " . POSTS_TEXT_TABLE . " pt
  17.  WHERE p.topic_id = $topic_id
  18.   AND p.poster_id = u.user_id
  19.   AND p.post_id = pt.post_id
  20.  ORDER BY p.post_time ASC
  21.  LIMIT $depart, $fin";
  22. if ( !($result = $db->sql_query($sql)) )
  23. {
  24.  message_die(GENERAL_ERROR, 'Could not obtain post/user information', '', __LINE__, __FILE__, $sql);
  25. }
  26. //
  27. // Okay, let's do the loop, yeah come on baby let's do the loop
  28. // and it goes like this ...
  29. //
  30. if ( $row = $db->sql_fetchrow($result) )
  31. {
  32.  $i = 0;
  33.  do
  34.  {.......


Message édité par xofred le 06-07-2003 à 19:39:17
Reply

Marsh Posté le 06-07-2003 à 19:36:38   

Reply

Marsh Posté le 06-07-2003 à 19:44:59    

xofred a écrit :

OK, c'est réglé gràce à LIMIT :
Je savais pas qu'on pouvait mettre par ex : LIMIT 15,30 ce qui permet de ne garder que les résultats de 15 à 30 !
J'ai donc pu laisser en ascendant grâce à cette fonction
Et voilà ! :)

:non:  
LIMIT 15, 30 renvoie 30 résultats, en commencant par le numéro 15 (numérotation commencant à 0).

Reply

Marsh Posté le 06-07-2003 à 19:49:13    

mrBebert a écrit :

:non:  
LIMIT 15, 30 renvoie 30 résultats, en commencant par le numéro 15 (numérotation commencant à 0).


Non, tu te trompes... La preuve ça fonctionne chez moi sur le principe 15 à 30 !

Reply

Marsh Posté le 06-07-2003 à 19:50:37    

Euh quoique t'as peut-être raison en fait, ça marche mais ..
EDIT : oui tu as raison, j'ai vérifié en remplaçant $fin par 100 sur un topic qui en compte peut-être 20, et effectivement ça ne change pas : il affiche de 15 à 100, mais comme il n'y en a que 20 je ne vois que de 15 à 20...  
 
Je vais régler ça


Message édité par xofred le 06-07-2003 à 19:53:21
Reply

Marsh Posté le 06-07-2003 à 20:04:25    

Essaie avec LIMIT 15, 2 ;)

Reply

Marsh Posté le 06-07-2003 à 20:12:01    

mrBebert a écrit :

Essaie avec LIMIT 15, 2 ;)  


En effet ;)
Bon j'ai modifié en conséquence. Une idée pour mettre le tout en une seule requête ? Sachant donc qu'il faut les deux variables issues de la requête 1 ( $post_depart et $nombre_post_a_afficher ) pour la 2ème...
 

Code :
  1. // Ma modif
  2. $sql = "SELECT topic_replies
  3. FROM " . TOPICS_TABLE . "
  4. WHERE topic_id = $topic_id";
  5. if ( !($result = $db->sql_query($sql)) )
  6. {
  7.  message_die(GENERAL_ERROR, 'Could not obtain post/user information', '', __LINE__, __FILE__, $sql);
  8. }
  9. if ( $row = $db->sql_fetchrow($result) )
  10. {
  11.  $nombre_posts_a_afficher = (($row['topic_replies']+1) % $board_config['posts_per_page']);
  12. // reste de la division du mombre de posts dans le topic par le nombre de posts par page
  13.  $post_depart = $row['topic_replies']+1 - $nombre_posts_a_afficher;
  14. }
  15. //fin ma modif
  16. $sql = "SELECT u.username, u.user_id, p.*,  pt.post_text, pt.bbcode_uid
  17.  FROM " . POSTS_TABLE . " p, " . USERS_TABLE . " u, " . POSTS_TEXT_TABLE . " pt
  18.  WHERE p.topic_id = $topic_id
  19.   AND p.poster_id = u.user_id
  20.   AND p.post_id = pt.post_id
  21.  ORDER BY p.post_time ASC
  22.  LIMIT $post_depart, $nombre_posts_a_afficher";
  23. if ( !($result = $db->sql_query($sql)) )
  24. {
  25.  message_die(GENERAL_ERROR, 'Could not obtain post/user information', '', __LINE__, __FILE__, $sql);
  26. }
  27. //
  28. // Okay, let's do the loop, yeah come on baby let's do the loop
  29. // and it goes like this ...
  30. //
  31. if ( $row = $db->sql_fetchrow($result) )
  32. {
  33.  $i = 0;
  34.  do
  35.  {.......


Message édité par xofred le 06-07-2003 à 20:13:47
Reply

Marsh Posté le 06-07-2003 à 20:14:23    

Tu veux afficher un nombre de posts dépendant du nombre total de posts ?
Ce ne serait pas plus d'en afficher un nombre fixe ? [:figti]

Reply

Marsh Posté le 06-07-2003 à 20:18:47    

mrBebert a écrit :

Tu veux afficher un nombre de posts dépendant du nombre total de posts ?
Ce ne serait pas plus d'en afficher un nombre fixe ? [:figti]  


 
Le but de cette modif est d'afficher(dans la fenêtre de réponse) le nombre exact de posts que l'on trouve à la dernière page (lorsqu'on lit le topic), afin de préserver la même 'image' quand on poste un nouveau message.
C'est ce qui est fait sur ce forum en fait...  
Mais bon ça fait une requête plus, là!

Reply

Marsh Posté le 06-07-2003 à 20:24:41    

Et le but est aussi d'afficher les posts dans l'ordre chronologique ascendant, mais pour ça il faut fixer un post de départ, mais ça ne peut être fait que par une variable...

Reply

Marsh Posté le 06-07-2003 à 20:28:26    

J'imagine que tu ne connais pas le numéro de la dernière page :/

Reply

Marsh Posté le 06-07-2003 à 20:33:17    

Non, il n'ya pas de numérotation par page, car le nombre de posts par page est modifiable... c'est  $board_config['posts_per_page']

Reply

Marsh Posté le 06-07-2003 à 20:37:56    

Le système qui était fait avant, c'était qu'il prenait les derniers posts du topic, donc en partant de la fin, en descendant et avec pour LIMIT le nombre maxi de posts par page...
 
Le truc qui me gêne c'était que ça s'affiche donc dans le mauvais ordre... D'où le but de ce topic ! :D
 
Enfin là, j'ai la meeilleure solution, mais il y a une requête de plus...

Reply

Marsh Posté le 06-07-2003 à 20:45:48    

Je pense qu'il est préférable de lire les résultats dans des variables puis de les afficher dans l'autre sens, au lieu de faire 2 requêtes [:figti]

Reply

Marsh Posté le 06-07-2003 à 20:50:18    

mrBebert a écrit :

Je pense qu'il est préférable de lire les résultats dans des variables puis de les afficher dans l'autre sens, au lieu de faire 2 requêtes [:figti]  


ah ...  :sweat: ouais bon... euh t'es sûr ? C'est pas vraiment facile en fait...
 
Tout à l'heure j'avais essayé de faire un  

Code :
  1. for($i=$board_config['posts_per_page'];$i=$depart;$i--)
  2. {
  3. ...
  4. }


 en remplacant $row[..] par $row[i][...] mais ça a foiré...
 
Tu crois que c'est une bonne idée ?

Reply

Marsh Posté le 06-07-2003 à 20:55:16    

Sinon, tu utilises mysql_result() pour accéder comme tu veux au résultat, en le parcourant "à l'envers"
 
$count = mysql_num_rows($result);
for ($i = ($count-1) ; $i >= 0 ; $i--) {
    // affichage i-ème post
    ...
    ...
}

Reply

Marsh Posté le 06-07-2003 à 21:00:52    

mrBebert a écrit :

Sinon, tu utilises mysql_result() pour accéder comme tu veux au résultat, en le parcourant "à l'envers"
 
$count = mysql_num_rows($result);
for ($i = ($count-1) ; $i >= 0 ; $i--) {
    // affichage i-ème post
    ...
    ...
}


Oui, c'est ce à quoi je pensais.. Bon je m'y colle

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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