Foros del Web » Programando para Internet » PHP »

Como invertir los resutados de una consulta?

Estas en el tema de Como invertir los resutados de una consulta? en el foro de PHP en Foros del Web. Hola a todos. Estoy realizando un prueba para una futura web. Tengo que mostrar los resultados de una consulta con limite (3), el problema es ...
  #1 (permalink)  
Antiguo 20/10/2007, 02:37
 
Fecha de Ingreso: septiembre-2006
Mensajes: 64
Antigüedad: 17 años, 6 meses
Puntos: 2
Como invertir los resutados de una consulta?

Hola a todos.
Estoy realizando un prueba para una futura web. Tengo que mostrar los resultados de una consulta con limite (3), el problema es que deben ser mostrados en orden inverso.
Ejemplo:
Código PHP:
//consulta
$sql "SELECT id,nombre FROM lista LIMIT 10,3";
$rs mysql_query($sql,$db);
while(
$row mysql_fetch_assoc($rs))
{
    echo 
$row["id"];
    echo 
" - ";
    echo 
$row["nombre"];
    echo 
"<br>";

Con esto me muestra:
11 - pepe
12 - juan
13 - manolo

Continua paginando de 3 en 3.
El problema es el orden lo que necesito es que me muestre:
13 - manolo
12 - juan
11 - pepe
y despues los 3 siguientes. 16 - xxxx;15 - xxxxx; 14 - xxxxx
pero si en la consulta uso ORDER BY id DESC me devuelve los ultimos ids. Es decir 99 - Juan, 98- oioas; etc...

De momento lo he arrglado así:
Código PHP:
//consulta
$sql "SELECT id,nombre FROM lista LIMIT 10,3";
$rs mysql_query($sql,$db);
$arr = array();
while(
$row mysql_fetch_assoc($rs))
{
   
$arr[$row["id"]] = $row["nombre"];
}

$arr array_reverse($arr);

foreach(
$arr as $key => $value)
{
 echo 
"$key - $value";

Pero me gustaría saber si se puede hacer algo más "comodo". Ya que el codigo final va ser con una consulta bastante mas compleja y que devuelve muchos campos no solo id y nombre.
Un saludo y gracias.

PD: el codigo es aproximado y de ejemplo. Ta escrito a pelo sin revisar ni nada, que estoy en el curro :)
  #2 (permalink)  
Antiguo 20/10/2007, 04:02
Avatar de ZiTAL  
Fecha de Ingreso: marzo-2004
Ubicación: Bermio (Bizkaia)
Mensajes: 1.545
Antigüedad: 20 años, 1 mes
Puntos: 62
Re: Como invertir los resutados de una consulta?

Código PHP:
$sql "SELECT id,nombre FROM lista LIMIT 10,3 order by id desc"
;)
__________________
http://zital.no-ip.org
____________________

Euskerie ahuen eta bijotzan
  #3 (permalink)  
Antiguo 20/10/2007, 04:40
 
Fecha de Ingreso: septiembre-2006
Mensajes: 64
Antigüedad: 17 años, 6 meses
Puntos: 2
Re: Como invertir los resutados de una consulta?

zital, el problema es que el "ORDER BY id DESC" no puede ir despues de limit porque, al menos a mi, me da error
y si lo pongo antes ocurre lo que comentaba, que me muestra los ultimos ids.
  #4 (permalink)  
Antiguo 20/10/2007, 05:21
okram
Invitado
 
Mensajes: n/a
Puntos:
Re: Como invertir los resutados de una consulta?

Pero en qué momento y cómo haces la paginación?

Tu consulta es:
Código PHP:
$sql "SELECT id,nombre FROM lista LIMIT 10,3"
Por lo que deduzco que en LIMIT 10, 3 va una variable que es definida según el número de página. Dependiendo de cada página será LIMIT 7,3; LIMIT 13,3; etc.. no? En tal caso, el usar ORDER BY ANTES del LIMIT no debe causarte problemas:
Código PHP:
$sql "SELECT id,nombre FROM lista ORDER BY id DESC LIMIT 10,3"
Un saludo,
  #5 (permalink)  
Antiguo 20/10/2007, 05:28
okram
Invitado
 
Mensajes: n/a
Puntos:
Re: Como invertir los resutados de una consulta?

Voy cayendo enla cuenta de tu problema creo ... Supongo que en la primera página quieres que te muestre los 3 primeros resultados (ID: 1,2,3), enla segunda ID:4,5,6.... , pero el orden no sea 1,2,3 ó 4,5,6, sino al revés (1ra: 3,2,1; 2da:6,5,4)... Es eso no?

En tal caso, no veo solución sencilla a través del query... Yo también lo haría usando arrays:

Debes consultar en orden ascendente, y una vez obtenidos los resultados, invertirlos:

Código PHP:
//consulta
$sql "SELECT id,nombre FROM lista ORDER BY id ASC LIMIT 10,3";
$rs mysql_query($sql,$db);
$datos = array();
while(
$row mysql_fetch_assoc($rs)) {
    
$datos[] = $row;
}
/*
  echo '<pre>';
  echo print_r($datos);
  echo '</pre>';
  exit;
*/
krsort($datos);
reset($datos);
while (list(
$key$row) = each($datos)) {
    echo 
$row["id"];
    echo 
" - ";
    echo 
$row["nombre"];
    echo 
"<br>";

Un saludo,

Última edición por okram; 20/10/2007 a las 05:42
  #6 (permalink)  
Antiguo 20/10/2007, 06:14
 
Fecha de Ingreso: septiembre-2006
Mensajes: 64
Antigüedad: 17 años, 6 meses
Puntos: 2
Re: Como invertir los resutados de una consulta?

Gracias OKRAM, efectivamente es como dices. (3,2,1... 6,5,4....9,8,7) etc.. y yo tambien creo que sera con arrays el problema sera cuando empieze a complicar con mas datos, es dectir en lugar de id,nombre añadir tambien, 3 o 4 campos mas. :)
Ya veremos como lo soluciono.

Gracias por todo.
Edito:
Código PHP:
list($key$row) = each($datos
No lo conocia de este modo. Creo que me servirá asi.
Gracias de nuevo.
  #7 (permalink)  
Antiguo 20/10/2007, 11:10
okram
Invitado
 
Mensajes: n/a
Puntos:
Re: Como invertir los resutados de una consulta?

Código PHP:
while (list($key$row) = each($datos)) {
    echo 
$row["id"];
    echo 
" - ";
    echo 
$row["nombre"];
    echo 
"<br>";

Podrias tambien usar foreach, y el número de campos no tiene nada que ver, pues $datos es un array de este tipo: $datos[fila][columna] = valor:
Código PHP:
foreach ($datos as $row) {
    echo 
$row["id"];
    echo 
" - ";
    echo 
$row["nombre"];
    echo 
" - ";
    echo 
$row["apellidos"];
    echo 
" - ";
    echo 
$row["email"];
    echo 
"<br>";

Es lo mismo

Fíjate como defines $datos:
Código PHP:
while($row mysql_fetch_assoc($rs)) {
    
$datos[] = $row;

Por lo tanto, no importa el número de columnas en tu consulta. Tdo se almacena y lo accedes igual que un while() con su mysql_fetch_assoc()...

Un saludo,
  #8 (permalink)  
Antiguo 20/10/2007, 12:28
 
Fecha de Ingreso: septiembre-2006
Mensajes: 64
Antigüedad: 17 años, 6 meses
Puntos: 2
Re: Como invertir los resutados de una consulta?

Si me he fijado, concretamente era lo de definir "$datos" lo que no se me habia ocurrido de ese modo. Taba despistao y no me daba cuenta de que los resultados de una consulta no dejan de ser un array por fila.

Supongo que no seré el unico al que un arbol no le deja ver el bosque.
JAJAJAJA

Un saludo y gracias de nuevo.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:28.