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

  FORUM HardWare.fr
  Programmation
  PHP

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°449712
xofred
Posté le 06-07-2003 à 18:07:10  profilanswer
 

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
mood
Publicité
Posté le 06-07-2003 à 18:07:10  profilanswer
 

n°449716
mrbebert
Posté le 06-07-2003 à 18:13:54  profilanswer
 

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

n°449723
xofred
Posté le 06-07-2003 à 18:17:10  profilanswer
 

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!
   

n°449726
mrbebert
Posté le 06-07-2003 à 18:21:22  profilanswer
 

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.

n°449729
xofred
Posté le 06-07-2003 à 18:22:41  profilanswer
 

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.

n°449731
xofred
Posté le 06-07-2003 à 18:24:11  profilanswer
 

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

n°449735
mrbebert
Posté le 06-07-2003 à 18:29:51  profilanswer
 

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

n°449746
xofred
Posté le 06-07-2003 à 19:25:42  profilanswer
 

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
n°449747
mrbebert
Posté le 06-07-2003 à 19:28:31  profilanswer
 

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

n°449754
xofred
Posté le 06-07-2003 à 19:36:38  profilanswer
 

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
mood
Publicité
Posté le 06-07-2003 à 19:36:38  profilanswer
 

n°449756
mrbebert
Posté le 06-07-2003 à 19:44:59  profilanswer
 

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

n°449759
xofred
Posté le 06-07-2003 à 19:49:13  profilanswer
 

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 !

n°449761
xofred
Posté le 06-07-2003 à 19:50:37  profilanswer
 

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
n°449765
mrbebert
Posté le 06-07-2003 à 20:04:25  profilanswer
 

Essaie avec LIMIT 15, 2 ;)

n°449770
xofred
Posté le 06-07-2003 à 20:12:01  profilanswer
 

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
n°449772
mrbebert
Posté le 06-07-2003 à 20:14:23  profilanswer
 

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]

n°449776
xofred
Posté le 06-07-2003 à 20:18:47  profilanswer
 

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à!

n°449780
xofred
Posté le 06-07-2003 à 20:24:41  profilanswer
 

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

n°449783
mrbebert
Posté le 06-07-2003 à 20:28:26  profilanswer
 

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

n°449789
xofred
Posté le 06-07-2003 à 20:33:17  profilanswer
 

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']

n°449799
xofred
Posté le 06-07-2003 à 20:37:56  profilanswer
 

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

n°449810
mrbebert
Posté le 06-07-2003 à 20:45:48  profilanswer
 

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]

n°449813
xofred
Posté le 06-07-2003 à 20:50:18  profilanswer
 

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 ?

n°449815
mrbebert
Posté le 06-07-2003 à 20:55:16  profilanswer
 

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

n°449818
xofred
Posté le 06-07-2003 à 21:00:52  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 


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

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

 

Sujets relatifs
[SQL] Surement simple : comment récupérer le nombre le plus elevé ?[SQL / Oracle] Tester un cas de concurrence.
urgent PL/SQL illisible[RESOLU]Type incompatible dans une requête
code SQL dans une requete ....[pu d'erreur inside !!!]Conversion de scripts SQL SERVER -> My SQL
[SQL] tester si une suppression est possible[MySQL ] c'est quoi la requete complète pour un dump d'une table ?
jointure ou requete imbriquée ? 
Plus de sujets relatifs à : [SQL] Comment inverser le résultat d'une requête?[réglé]


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