Foros del Web » Programando para Internet » PHP »

Posicion de un Registro

Estas en el tema de Posicion de un Registro en el foro de PHP en Foros del Web. Tema: Consulta y Posicion de resultados Pregunta: ¿Como puede saber la posicion de X registro dentro de una consulta? Respuesta: Código PHP: function  Posicion (){ ...
  #1 (permalink)  
Antiguo 27/01/2008, 20:00
Avatar de McBlink  
Fecha de Ingreso: noviembre-2006
Ubicación: $ARG->LaPampa()
Mensajes: 1.694
Antigüedad: 17 años, 5 meses
Puntos: 23
De acuerdo Posicion de un Registro

Tema: Consulta y Posicion de resultados
Pregunta: ¿Como puede saber la posicion de X registro dentro de una consulta?
Respuesta:

Código PHP:

function Posicion(){
$Consulta mysql_query("SELECT * FROM tabla ");
$i 1
$id $_SESSION['id']; // ID a sacar posicion
while($row=mysql_fetch_assoc($Consulta)){  
  if(
$row['id'] == $id) { 
    
$Posicion $i;
      
    break;
    } 
  
$i++; 
}
return 
$Posicion;

Para visualizar la posicion

Código PHP:
echo Posicion(); 
Saludos.
__________________
Recuerda usar el highlight para mostrar código
mauricioblint.com
  #2 (permalink)  
Antiguo 30/01/2008, 09:02
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Re: Posicion de un Registro

Hola McBlink,

Gracias por postear esta FAQ, te comento sin embargo que tu código no es óptimo, ya que recorre todo el resultset, y utiliza variables de sesión que son innecesarias.

Puedes optimizar mucho mas tu código si usas un ID numérico para identificar las filas de tu tabla y así podrías saber la posición (si ordenas por ID).

Saludos.
  #3 (permalink)  
Antiguo 30/01/2008, 10:49
Avatar de laaccaal  
Fecha de Ingreso: julio-2003
Ubicación: Murcia
Mensajes: 147
Antigüedad: 20 años, 9 meses
Puntos: 1
Re: Posicion de un Registro

No comprendo para que quieres saber que posicion tiene una consulta pasada a un array; con tu codigo estarias haciendo esto, debes tener tus motivos pero explica que quieres hacer, para que te podamos ayudar

saludos
__________________
Album Fotos
Blog MisApuntes
  #4 (permalink)  
Antiguo 30/01/2008, 12:38
Avatar de McBlink  
Fecha de Ingreso: noviembre-2006
Ubicación: $ARG->LaPampa()
Mensajes: 1.694
Antigüedad: 17 años, 5 meses
Puntos: 23
Re: Posicion de un Registro

Cita:
Iniciado por GatorV Ver Mensaje
Hola McBlink,

Gracias por postear esta FAQ, te comento sin embargo que tu código no es óptimo, ya que recorre todo el resultset, y utiliza variables de sesión que son innecesarias.

Puedes optimizar mucho mas tu código si usas un ID numérico para identificar las filas de tu tabla y así podrías saber la posición (si ordenas por ID).

Saludos.
Hola GatorV
te explico, la variable de Sesion la puse como ejemplo, para que puedan saber que alli, va el ID o el Usuario o el dato que quieran encontrar en el registro y saber su posicion..
podria haber puesto:
Código PHP:
$id $_SESSION['id'];
$id $_POST['id'];
$id $_POST['nick'];
$id $variable_con_el_dato_a_buscar
Se entiende?
De que forma lo podemos acomodar para que quede optimo..?

Saludos.
__________________
Recuerda usar el highlight para mostrar código
mauricioblint.com
  #5 (permalink)  
Antiguo 30/01/2008, 12:40
Avatar de McBlink  
Fecha de Ingreso: noviembre-2006
Ubicación: $ARG->LaPampa()
Mensajes: 1.694
Antigüedad: 17 años, 5 meses
Puntos: 23
Re: Posicion de un Registro

Cita:
Iniciado por laaccaal Ver Mensaje
No comprendo para que quieres saber que posicion tiene una consulta pasada a un array; con tu codigo estarias haciendo esto, debes tener tus motivos pero explica que quieres hacer, para que te podamos ayudar

saludos
Hola laaccaal,
es muy comun saber en que posicion esta un registro, por ejemplo para sacar en que posicion de un ranking esta X usuario.
lo que quierIA hacer era eso, como lo hice y me funciono.Me parecio correcto postearlo en las FAQ'S para que a otro que tenga la misma duda la sirva..

Saludos.
__________________
Recuerda usar el highlight para mostrar código
mauricioblint.com

Última edición por McBlink; 30/01/2008 a las 12:47
  #6 (permalink)  
Antiguo 30/01/2008, 12:46
 
Fecha de Ingreso: noviembre-2002
Mensajes: 1.341
Antigüedad: 21 años, 5 meses
Puntos: 17
Re: Posicion de un Registro

Personalmente haría algo así:

Código PHP:

function Posicion($valor$tabla){
     
$Consulta mysql_query("SELECT * FROM $tabla");
     
$i 1
     while(
$row=mysql_fetch_assoc($Consulta)){  
          if(
$row[0] == $valor)      
               break;
          
$i++; 
     }
     return 
$i;

  #7 (permalink)  
Antiguo 30/01/2008, 12:50
 
Fecha de Ingreso: noviembre-2002
Mensajes: 1.341
Antigüedad: 21 años, 5 meses
Puntos: 17
Re: Posicion de un Registro

Pensándolo bien, cambiaría alguna cosa:

Código PHP:

function Posicion($valor$campo$tabla){
     
$Consulta mysql_query("SELECT $campo FROM $tabla");
     
$i 0
     while(
$row=mysql_fetch_assoc($Consulta)){  
          
$i++; 
          if(
$row[$campo] == $valor)      
               break;
     }
     return 
$i;

Así si no encuentra resultados devolvería cero. Y se especifican tanto el valor como el campo y la tabla, es mucho más general.
  #8 (permalink)  
Antiguo 30/01/2008, 12:53
Avatar de McBlink  
Fecha de Ingreso: noviembre-2006
Ubicación: $ARG->LaPampa()
Mensajes: 1.694
Antigüedad: 17 años, 5 meses
Puntos: 23
Re: Posicion de un Registro

Hola Keysher,
es similar a lo que hice yo..
en tu consulta no estas aclando que buscar,

Saludos.
__________________
Recuerda usar el highlight para mostrar código
mauricioblint.com
  #9 (permalink)  
Antiguo 30/01/2008, 13:00
Avatar de McBlink  
Fecha de Ingreso: noviembre-2006
Ubicación: $ARG->LaPampa()
Mensajes: 1.694
Antigüedad: 17 años, 5 meses
Puntos: 23
Re: Posicion de un Registro

Ahora si,
tendria que andar bien..
pero igual quisiera la opinion de GatorV,

aunque seria lo mismo que si a la funcion mia le cambio la consulta por:
Código PHP:
$Consulta mysql_query("SELECT campo FROM tabla "); 
Algo debe faltar, quisiera la opinion de GatorV

Saludos
__________________
Recuerda usar el highlight para mostrar código
mauricioblint.com
  #10 (permalink)  
Antiguo 30/01/2008, 13:03
 
Fecha de Ingreso: noviembre-2002
Mensajes: 1.341
Antigüedad: 21 años, 5 meses
Puntos: 17
Re: Posicion de un Registro

No, no es lo mismo.
$campo y $tabla son dos variables que se le pasa a la función para especificar el campo a comparar y la tabla en la que realizar la búsqueda. Si no se especifican debería ir metido en el código el campo y la tabla, y sería una función muy poco flexible. Tal y como la imagino yo debería ser lo suficientemente abierta para poder utilizar la misma función para sacar la posición de cualquier campo de cualquier tabla. Por eso obligo a que haya tres parámetros.
  #11 (permalink)  
Antiguo 30/01/2008, 13:26
Avatar de McBlink  
Fecha de Ingreso: noviembre-2006
Ubicación: $ARG->LaPampa()
Mensajes: 1.694
Antigüedad: 17 años, 5 meses
Puntos: 23
Re: Posicion de un Registro

Si, eso es mas flexible, pero basicamente es lo mismo..
de todos modos, GatorV dijo algo que se recorre todo el recorset..

Saludos.
MC
__________________
Recuerda usar el highlight para mostrar código
mauricioblint.com
  #12 (permalink)  
Antiguo 30/01/2008, 13:49
 
Fecha de Ingreso: noviembre-2002
Mensajes: 1.341
Antigüedad: 21 años, 5 meses
Puntos: 17
Re: Posicion de un Registro

No exactamente. Se recorre hasta que encuentra el valor. Si lo encuntra en la última posición, sí que habrá recorrido el resultado de la consulta entero, pero si lo encuentra en la tercera posición se parará ahí.

Lo que GatorV sugiere es que la tabla lleve un ID autonumerico y se pregunte por ese campo, algo del éste estilo:

Código PHP:

function Posicion($valor$campo$tabla){ 
     
$Consulta mysql_query("Select ID_autonumerico from $tabla WHERE $campo = $Valor"); 
     
    
$row=mysql_fetch_assoc($Consulta)){   
    return 
$row['ID_autonumerico']; 

Pero ello obligaría a que la tabla tenga un nuevo campo. Lo que ignoro es que si desde MySQL (u otros motores de BDD) se puede sacar ese número con una consulta, es decir, la posición dentro de una tabla de un elemento dado.
  #13 (permalink)  
Antiguo 30/01/2008, 14:41
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 6 meses
Puntos: 41
Re: Posicion de un Registro

La verdad, el tema es interesante. Aunque creo que es un caso más para el foro de bases de datos.

La manera cómo está planteada la solución se va tornando menos óptima si:
- La cantidad total de registros es alta.
- El registro particular que buscamos está más cerca del último lugar.

Pero el problema no parece estar aterrizado en un caso concreto, así que voy a utilizar lo propuesto por McBlink
Cita:
Iniciado por McBlink
es muy comun saber en que posicion esta un registro, por ejemplo para sacar en que posicion de un ranking esta X usuario.
Entonces, supongamos que tenemos esta tabla:
Código:
tabla: usuarios
------------------------
id	nombre	puntos
------------------------
1	juan	400
2	carola	100
3	lucas	200
4	pedro	500
5	paula	300
------------------------
...y queremos saber en qué posición del ránking está "lucas"(id = 3).

Una manera de resolver el problema pude ser dividirlo en dos consultas:
- Una que nos diga el puntaje del usuario "lucas" (o id=3).
- Otra que nos diga cuántos registros hay con más de ése puntaje.

Código PHP:
$id_usuario_buscado 3;

$sql_puntaje_usuario "SELECT puntos FROM usuarios WHERE id = $id_usuario_buscado";
$resultset_puntaje mysql_query($sql_puntaje_usuario);
$puntaje_usuario_buscado mysql_result($resultset_puntaje0);

$sql_posicion_usuario "SELECT COUNT(id) AS posicion WHERE puntos > $puntaje_usuario_buscado";
$resultset_posicion mysql_query($sql_posicion_usuario);
$posicion_usuario_buscado mysql_result($resultset_puntaje0); 
Es una manera muchísimo más eficiente de hacer lo que plantean.

No sé si pueda haber otra mejor provista por el motor de mysql directamente. Podrían preguntar en el foro de Bases de datos.

Un abrazo
  #14 (permalink)  
Antiguo 30/01/2008, 14:56
 
Fecha de Ingreso: noviembre-2002
Mensajes: 1.341
Antigüedad: 21 años, 5 meses
Puntos: 17
Re: Posicion de un Registro

El caso es que en el tema expuesto (o al menos en lo que me he basado yo) no tiene porqué haber una tabla autonumerica con el número de posición.

La finalidad es saber la posición que ocupa un registro en una tabla. Cualquier tabla, no tiene porque tener un ID numerico y correlativo. En ese supuesto sólo se me ocurre la función que he planteado yo. No sé si habrá algo en SQL para sacar esto en una consulta.

Para completar la función, podría aceptar un último parámetro que fuera el orden que ha de tener la consulta.
  #15 (permalink)  
Antiguo 30/01/2008, 15:06
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 6 meses
Puntos: 41
Re: Posicion de un Registro

Cita:
Iniciado por Keysher
La finalidad es saber la posición que ocupa un registro en una tabla. Cualquier tabla, no tiene porque tener un ID numerico y correlativo. En ese supuesto sólo se me ocurre la función que he planteado yo. No sé si habrá algo en SQL para sacar esto en una consulta.
No sé qué tiene esto que ver con lo que yo puse. El id es algo que todo registro debe tener y no interesa si es numérico ni correlativo. De hecho, el id autonumérico no es un parámetro confiable para consultas como ésta, debido a que puede haber registros borrados.

¿Leiste por lo menos la solución que planteé?

De hecho, en mi ejemplo, el usuario "lucas" con id=3 ocupa la posición 4.
  #16 (permalink)  
Antiguo 30/01/2008, 15:15
 
Fecha de Ingreso: noviembre-2002
Mensajes: 1.341
Antigüedad: 21 años, 5 meses
Puntos: 17
Re: Posicion de un Registro

Tengo una tabla con usuario: id_login, nombre y mail.

user1 Usuario1 [email protected]
user2 Usuario2 [email protected]
...
userN UsuarioN [email protected]

¿Cómo sacaría la posición del usuarioN?
  #17 (permalink)  
Antiguo 30/01/2008, 15:31
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 6 meses
Puntos: 41
Re: Posicion de un Registro

Cita:
Iniciado por Keysher Ver Mensaje
Tengo una tabla con usuario: id_login, nombre y mail.

user1 Usuario1 [email protected]
user2 Usuario2 [email protected]
...
userN UsuarioN [email protected]

¿Cómo sacaría la posición del usuarioN?
¿La posición con respecto a qué?¿a cómo fueron insertados en la tabla?¿o cuál es el criterio para ordenar los usuarios?
  #18 (permalink)  
Antiguo 30/01/2008, 15:44
 
Fecha de Ingreso: noviembre-2002
Mensajes: 1.341
Antigüedad: 21 años, 5 meses
Puntos: 17
Re: Posicion de un Registro

La idea de la función era sacar la posición que ocupa un determinado registro en una tabla. La fila. No se especificaba ningún criterio, se tomaba el orden por defecto de la tabla.

No obstante, como he comentado antes, estaría bien que también aceptase como parametro el orden (campo y si es ascendente o descendente).

El fin es saber el número de fila, nada más. ¿Para qué sirve esto? La verdad es que ni lo he pensado, sólo he buscado el modo más óptimo y genérico de conseguirlo, y creo que es con la función que planteé (y si es necesario agregando lo del orden).
  #19 (permalink)  
Antiguo 30/01/2008, 15:59
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Re: Posicion de un Registro

Es a lo que me refería, si quieres sacar el ranking lo mejor es que tengas una forma consistente de buscar en la tabla, porque si ejecutas un comando ALTER, y cambias el ORDER BY por defecto tu sistema se alteraría.

Adicionalmente hay que tener en cuenta que MySQL cuando tu le mandas un comando DELETE, NO BORRA EL DATO, simplemente lo reemplaza/marca como basura para optimizar el codigo, por lo que si tienes una tabla:
Código:
id          nombre        mail
1           juan             [email protected]
2           pedro           [email protected]
3           luis               luis@@server.com
4           manuel         [email protected]
Y le dices a MySQL borra el registro con ID=3, la tabla queda asi:
Código:
id          nombre        mail
1           juan             [email protected]
2           pedro           [email protected]
*           ***               ******
4           manuel         [email protected]
Si posteriormente insertamos un nuevo registro, los datos quedan asi:
Código:
id          nombre        mail
1           juan             [email protected]
2           pedro           [email protected]
5           marco           marco@@server.com
4           manuel         [email protected]
Si nos damos cuenta el orden de la tabla cambio al borrar/insertar, y a lo que voy es que si usas un código como el que buscas tu "posición" va a cambiar todo el tiempo, y dependiendo de tu aplicación, no te va a servir y te va a dar resultados inesperados.

Saludos.
  #20 (permalink)  
Antiguo 30/01/2008, 16:19
 
Fecha de Ingreso: noviembre-2002
Mensajes: 1.341
Antigüedad: 21 años, 5 meses
Puntos: 17
Re: Posicion de un Registro

Lo ideal es que todas las consultas a una BDD vayan con un ORDER BY, para evitarnos sorpresas (en concreto lo que comenta GatorV).

No discuto el hecho de que un ID es algo vital en una tabla, ni siquiera pretendo justificar la necesidad de obtener la posición. Pero ese era el tema del post, sólo me he limitado a buscar la mejor manera posible y hacer una función lo más genérica que he podido. Y creo que la forma en la que lo he planteado es una buena opción (faltaría poder especificar el orden, y asegurarse de que no se puede sacar con el lenguaje SQL sin tener que recurrir al bucle)

Que sea útil o no es otro tema....
  #21 (permalink)  
Antiguo 30/01/2008, 16:21
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Re: Posicion de un Registro

Totalmente de acuerdo Keysher, pero la idea es dar la mejor solución ya que he visto que muchos usuarios les interesa saber eso para "pintar" de diferente color un registro, y lo ideal creo es lo que comenta JPinedo (usa solo 2 Querys) y así puedes saber en que parte esta el registro.

Saludos.
  #22 (permalink)  
Antiguo 30/01/2008, 16:25
 
Fecha de Ingreso: noviembre-2002
Mensajes: 1.341
Antigüedad: 21 años, 5 meses
Puntos: 17
Re: Posicion de un Registro

Desde luego para darle esa utilidad es mejor con funciones propias de SQL. Realmente no sé que aplicación práctica puede tener sacar el número de posición, supongo que para casos puntuales podría valer (sobre todo combinado con un orden en concreto puede dar bastante juego)
  #23 (permalink)  
Antiguo 30/01/2008, 18:56
Avatar de McBlink  
Fecha de Ingreso: noviembre-2006
Ubicación: $ARG->LaPampa()
Mensajes: 1.694
Antigüedad: 17 años, 5 meses
Puntos: 23
Re: Posicion de un Registro

Buenas Noches,
recien eh llegadoy me encuentro con tremendo post,
bueno, la verdad me he perdido con tantas respuesta pero a lo que voy es que creo yo, estoy de acuerdo con Keysher que la manera mas eficaz en la que plantie yo primero, y que Keysher optimizo, haciendo una funcion mas flexible.
La idea de esto, era simpelmete con un dato: Nick, Email, Id o el que fuese, obtener dicha pocision ordenado por X campo, sena puntos o el que fuese...
De esta forma, como bien dijo GatorV:
Cita:
la idea es dar la mejor solución ya que he visto que muchos usuarios les interesa saber eso para "pintar" de diferente color un registro
Se puede pintar, resaltar o simplemente sacar la posicion de ese usuario y despues veras para que le das la utilidad, si para las anteriormente nombradas u otra..

Ahora bien, yo creo que la funcion, como dije antes, que termino de optimizar Keysher, hace justamente esto, recorre la consulta y te dice en que posicion se encuentra el ID NICK o el que fuese...

Saludos


PD: ¿Puedo postear la funcion en las FAQ'S ?

Código PHP:
function Posicion($valor$campo$tabla){
     
$Consulta mysql_query("SELECT $campo FROM $tabla");
     
$i 0
     while(
$row=mysql_fetch_assoc($Consulta)){  
          
$i++; 
          if(
$row[$campo] == $valor)      
               break;
     }
     return 
$i;

__________________
Recuerda usar el highlight para mostrar código
mauricioblint.com
  #24 (permalink)  
Antiguo 31/01/2008, 17:05
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 6 meses
Puntos: 41
Re: Posicion de un Registro

Claro que puedes postearla. Edita tu FAQ anterior con las modificaciones.

De todas maneras, repito, la solución es muy poco eficiente.
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 18:39.