Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

posición relativa de un registro en la base de datos

Estas en el tema de posición relativa de un registro en la base de datos en el foro de Mysql en Foros del Web. Hola, necesito alguna función o consulta SQL para saber en qué posición se encuentra un registro en mi base de datos. Es decir, hay un ...
  #1 (permalink)  
Antiguo 06/12/2009, 11:12
Avatar de humanista  
Fecha de Ingreso: abril-2005
Mensajes: 878
Antigüedad: 19 años
Puntos: 15
posición relativa de un registro en la base de datos

Hola, necesito alguna función o consulta SQL para saber en qué posición se encuentra un registro en mi base de datos.

Es decir, hay un campo id por el que puedo buscar el registro sin problemas. La tabla la ordeno por otro campo llamado puntuacion de forma descendente.

El tema es saber si mi registro (buscando por id) está en la posición X de la tabla ordenada por puntuacion.

Gracias....
  #2 (permalink)  
Antiguo 06/12/2009, 12:08
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: posición relativa de un registro en la base de datos

Mira en las faq's de mysql un ejemplo que pone gnzsoloyo. Te puede servir.

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 06/12/2009, 16:38
Avatar de humanista  
Fecha de Ingreso: abril-2005
Mensajes: 878
Antigüedad: 19 años
Puntos: 15
Respuesta: posición relativa de un registro en la base de datos

pues siguiendo tus indicaciones he puesto:

$resultlinea=mysql_query("SELECT (@REG := @REG + 1) linea, * FROM (SELECT @REG :=0, * FROM tabla where id='$id') Tabla2",$link);


if($row = mysql_fetch_array($resultlinea))

{
$linea = $row[linea];
echo $linea;
}

y no me sale nada
  #4 (permalink)  
Antiguo 06/12/2009, 16:46
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: posición relativa de un registro en la base de datos

haz las pruebas directamente desde mysql.
Si te funciona, después te preocupas como lo haces funcionar de php en dicho foro.

Ingresa la consulta en phpmyadmin o el gstor de mysql que tengas la consulta y dinos si es la salida que quieres

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #5 (permalink)  
Antiguo 06/12/2009, 17:26
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: posición relativa de un registro en la base de datos

No funciona poner un asterisco solo después del uso de variables de usuario. Eso genera un error de sintaxis.
Para que puedas usar el asterisco, debes usar o el nombre de la tabla o el alias.
Código SQL:
Ver original
  1. SELECT
  2.     (@REG := @REG + 1) linea,
  3.     Tabla2.*
  4. FROM
  5.    (SELECT
  6.         @REG :=0,
  7.         T1.*
  8.     FROM Tabla1 T1
  9.     WHERE id='$id') Tabla2;
Por lo demás, este caso solamente tiene sentido si en Tabla1 existe más de un registro que cumpla la condición id='$id'. Si la subconsulta solamente devuelve un registro, esto no tiene ninguna utilidad.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 07/12/2009, 04:44
Avatar de humanista  
Fecha de Ingreso: abril-2005
Mensajes: 878
Antigüedad: 19 años
Puntos: 15
Respuesta: posición relativa de un registro en la base de datos

sigo igual...

SELECT (@REG := @REG + 1) linea FROM (SELECT @REG :=0, tabla.* t1 FROM tabla where id='$id' order by score desc) tabla2

al menos ahora me devuelve un valor... el 1.

pongo el campo t1 pero realmente no sé pq. Esta sintaxis de las variables globales no la entiendo, si alguien me podría indicar algo más sobre esto quizá lo podría arreglar yo mismo. no encuentro nada sobre estos temas...

mi tabla tiene registros únicos del campo id. es decir q sólo va a encontrar 1 registro q tenga esa id.

también he añadido el order by pq la idea es que la tabla esté ordenada por score que es el campo que dice cuántos puntos tiene el registro. Lo que necesito es la posición de mi registro (id) en la tabla de puntos.

Algo así como la clasificación de la liga de fútbol. en qué posición de la tabla está mi equipo favorito.

salu2
  #7 (permalink)  
Antiguo 07/12/2009, 05:19
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: posición relativa de un registro en la base de datos

Ahí lo que estas haciendo es mostrar uicamente el campo linea de la consulta externa.
Sospecho que solo te trae el 1, por que solo hay un id en la tabla y eso es lo que trata de mostrar.

El t1 del ejemplo es el uso del alias de la tabla para simplficar consultas largas y densas.

Se que es una pregunta boba, pero tu tabla se llama "tabla"?

prueba así

Código sql:
Ver original
  1. SELECT (@REG := @REG + 1) linea, t2.* FROM (SELECT @REG :=0, t1.* FROM tabla t1 ORDER BY t1.score DESC) t2

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #8 (permalink)  
Antiguo 07/12/2009, 05:34
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: posición relativa de un registro en la base de datos

Cita:
pongo el campo t1 pero realmente no sé pq. Esta sintaxis de las variables globales no la entiendo, si alguien me podría indicar algo más sobre esto quizá lo podría arreglar yo mismo. no encuentro nada sobre estos temas...
Lo que no estás comprendiendo bien es el uso de alias. T1 lo puse como alias de la tabla para poder invocar todos los campos, como ya te expliqué en el post, pero un SELECT *... no puede usar alias para los campos. Para usar alias tienes que invocar todos los campos por su nombre y ponerles alias a cada uno por separado.

Cita:
mi tabla tiene registros únicos del campo id. es decir q sólo va a encontrar 1 registro q tenga esa id.
A eso me refería con que la sentencia tiene sentido si y sólo si va a devolver más de un registro por resultado.

Cita:
también he añadido el order by pq la idea es que la tabla esté ordenada por score que es el campo que dice cuántos puntos tiene el registro. Lo que necesito es la posición de mi registro (id) en la tabla de puntos.

Algo así como la clasificación de la liga de fútbol. en qué posición de la tabla está mi equipo favorito.
En ese contexto, puedo proporcionarte una solución, pero necesito la sentencia completa, y exactamente la que estás usando. No me sirve que eme pongas una sentencia genérica, porque tu caso es específico.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 07/12/2009, 12:57
Avatar de humanista  
Fecha de Ingreso: abril-2005
Mensajes: 878
Antigüedad: 19 años
Puntos: 15
Respuesta: posición relativa de un registro en la base de datos

OK gnzsoloyo, te pego la sentencia tal y como la tengo:

$resultlinea=mysql_query("SELECT (@REG := @REG + 1) linea, t2.* FROM (SELECT @REG :=0, famous.* t1 FROM famous where id='$id' order by score desc) t2",$link);

if($row = mysql_fetch_array($resultlinea))

{
$linea = $row[linea];
echo $linea;
}
  #10 (permalink)  
Antiguo 07/12/2009, 13:29
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: posición relativa de un registro en la base de datos

La solución es en realidad simple: es una consulta con subconsultas en tres niveles:
1. El nivel interior solamente recoge todos los datos y le agrega una primera columna con una variable inicializada a cero.
2. El segundo nivel ordena todos los scores en forma descendente y numera a cada uno.
3. En el tercer nivel recién se puede recoger uno específico...

Código sql:
Ver original
  1. SELECT LINEA, SCORES.*
  2. FROM
  3.   (SELECT (@REG := @REG + 1) LINEA, T2.*
  4.    FROM
  5.       (SELECT @REG :=0, famous.* FROM famous ORDER BY score DESC) T2
  6.    ) SCORES
  7. WHERE id='$id';

Normalmente, este tercer nivel no se realiza en la base, sino que tomas la tabla devuelta en el segundo nivel y luego, en el programa, seleccionas el o los registros que te interesan.
La consulta tal y como la planteas está hecha para devolver un sólo registro, por eso requiere tres niveles: Si la selección del registro la hicieras en el segundo, todavía no se han numerados las jerarquías, por lo que su numero sería siempre uno, ya que solamente tomaría un registro de todo el conjunto...


¿Se entiende la idea?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #11 (permalink)  
Antiguo 07/12/2009, 15:19
Avatar de humanista  
Fecha de Ingreso: abril-2005
Mensajes: 878
Antigüedad: 19 años
Puntos: 15
Respuesta: posición relativa de un registro en la base de datos

gnzsoloyo eres una máquina, funciona!!!, no lo llego a entender perfectamente pero lo cierto es que funciona.

graciassssssss
  #12 (permalink)  
Antiguo 07/12/2009, 18:44
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: posición relativa de un registro en la base de datos

Cita:
no lo llego a entender perfectamente
Las subconsultas son como cualquier operación con paréntesis: Tienes que resolverla desde adentro hacia afuera.
Ten en cuenta que cada capa de una subconsulta lo que hace es generar una tabla en memoria (tabla derivada) que contiene los resultados de ese nivel. Como es una tabla, y las tablas se identifican por nombres, toda subconsulta debe terminar con un alias. Es obligatorio.
Así, lo primero que se hace en este caso es decirle a MySQL que devuelva todos los registros ordenados por puntaje descendiente, pero que además incluya una columna que se usará para una variable de usuario. Cualquier cosa que agregues al listados del select, y que cumpla los requisitos para devolver un dato (valor y nombre), se convierte en una columna.

En la segunda subconsulta, lo único que se hace es volver a tomar los datos ya devueltos, pero hacer que la variable trabaje como un contador.

El secreto: Los valores de las variables de usuario cambian en el mismo punto donde se hace una asignación. Así, cuando lee el primer registro toma el valor 1. Pero cuando llega a leer el segundo registro, ya tiene el valor 1, así que incrementa a 2, y así sucesivamente.

Si quieres ver cómo cambian los valores de una variable con cada aparición, ejecuta esto:
Código SQL:
Ver original
  1. SELECT @A:=1, @A, @A:=2, @A, @A:=3, @A, @A:=4, @A
  2. FROM (SELECT @A:=0) TABLA;
Verás que con cada asignación, aún en el mismo registro, la variable cambia de valor.

Finalmente, en el SELECT exterior estás recibiendo la tabla, ordenada como la primera, pero con los registros numerados de uno en uno. Allí solamente tienes que elegir cuál es el que quieres. Por eso el valor de ID se usa solamente en ese (caso contrario, la numeración daría siempre 1).
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
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 00:15.