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

Simplificar Consulta

Estas en el tema de Simplificar Consulta en el foro de Mysql en Foros del Web. Buenas! Tengo una tabla con los campos Nombre y Puntuacion. Lo que quiero, es que si el usuario consigue 1000 puntos, busque en la sql ...
  #1 (permalink)  
Antiguo 18/04/2013, 12:10
 
Fecha de Ingreso: mayo-2009
Mensajes: 232
Antigüedad: 14 años, 11 meses
Puntos: 3
Simplificar Consulta

Buenas!

Tengo una tabla con los campos Nombre y Puntuacion.

Lo que quiero, es que si el usuario consigue 1000 puntos, busque en la sql el numero de usuarios que tienen mas de mil puntos, y de todos ellos, el que tenga menos, 1001 por ejemplo, para decirle al usuario quien esta por encima suyo.

Lo sabria hacer seleccioinando todos los usuarios por encima, y ordenarlos por puntuacion, luego con un count(array) saber el numero y seleccionando el ultimo del array seria el contrincante.

Pero esto se pede hacer en una consulta? Para no tener que cargar todos los usuarios en el array, hay miles de usuarios.

GRacias!
  #2 (permalink)  
Antiguo 18/04/2013, 12:31
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Simplificar Consulta

Hola phyronx:

Y cómo es la estructura de tu tabla??? cómo sé cuando un jugador alcanza los 1000 puntos??? cómo contabilizas estos puntos???

Para obtener lo que quieres en realidad tienes muchas formas para hacerlo... depende mucho de la estructura de tu tabla, pero veamos un ejemplo para ver si te sirve, supongamos que tienes los siguientes datos:


Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla;
  2. +------+---------+--------+
  3. | id   | jugador | puntos |
  4. +------+---------+--------+
  5. |    1 | uno     |    999 |
  6. |    2 | dos     |   1000 |
  7. |    3 | tres    |   1010 |
  8. |    4 | cuatro  |    998 |
  9. |    5 | cinco   |   1001 |
  10. |    6 | seis    |   1011 |
  11. +------+---------+--------+
  12. 6 rows in set (0.01 sec)

Observa que el jugador 2 llegó a los 1000 puntos, para obtener a su contrincante, puedes hacerlo así:

Código MySQL:
Ver original
  1. mysql> SELECT T1.*,
  2.     -> ( SELECT jugador
  3.     ->   FROM tabla T2
  4.     ->   WHERE T2.puntos > T1.puntos
  5.     ->   ORDER BY puntos LIMIT 1) contrincante
  6.     -> FROM tabla T1
  7.     -> WHERE
  8.     -> T1.puntos = 1000;
  9. +------+---------+--------+--------------+
  10. | id   | jugador | puntos | contrincante |
  11. +------+---------+--------+--------------+
  12. |    2 | dos     |   1000 | cinco        |
  13. +------+---------+--------+--------------+
  14. 1 row in set (0.01 sec)

Observa que sólo obtengo el nombre del contrincante, no los puntos que tiene, pero si analizas los datos, verás que es el que está encima de su puntaje.

Esta es una forma para hacerlo, pero insisto que hay muchas otras, todo depende de tus datos.

saludos
Leo.
  #3 (permalink)  
Antiguo 18/04/2013, 12:51
 
Fecha de Ingreso: mayo-2009
Mensajes: 232
Antigüedad: 14 años, 11 meses
Puntos: 3
Respuesta: Simplificar Consulta

GRacias de antemano! ;)

La tabla es tal y como la pones, el usuario acaba e juego consigue 1000 puntos y hace el update a la tabla, para luego hacer el select segun esa puntuacion.

El resultado de tu consulta no es exactamente lo que necesito.

Sacar solo el contrincante y su marca lo habia conseguido.

Necesito:

-El numero de usuarios con una puntuacion superior (para saber en que posicion esta).

-El nombre y puntuacion del usuario siguiente a la puntuacion de este usuario (como lo que has echo mas la puntuacion).

Y no entendi lo de T1 y t2 ya que es una sola tabla.

Los puntos edl usuario en cuenstion, no los necesito ya que lo realizo en la misma pagina que el update, asi que los mantengo en una variable.

La consulta que yo hice fue:

Código MySQL:
Ver original
  1. select nombre,puntuacion from tabla
  2. where puntuacion >1000 order by puntuacion DESC limit 1

Con esto tenia al contrincante, me faltaria saber su posicion y restarle 1 o la del usuario

Última edición por gnzsoloyo; 18/04/2013 a las 13:13
  #4 (permalink)  
Antiguo 18/04/2013, 13:02
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, 4 meses
Puntos: 2658
Respuesta: Simplificar Consulta

Cita:
El resultado de tu consulta no es exactamente lo que necesito
Si quieres un ejemplo que te sirva, entonces debes postear la información que a nosotros nos sirva para entender el caso, y poder dar sugerencias.
Postea la estructura de la tabla.
Cita:
Y no entendi lo de T1 y t2 ya que es una sola tabla.
Para nuestra visión de arquitectura de datos, lo que estás haciendo está mal, porque no manejaríamos eso en una única tabla. Eso es un muy mal diseño de datos para una aplicación como describes.

Cita:
Los puntos edl usuario en cuenstion, no los necesito ya que lo realizo en la misma pagina que el update, asi que los mantengo en una variable.
Lo que hagas en la pagina, no es tema que nos ocupemos. Programación no es asunto de este foro. Las sugerencias de Leo apuntan a un buen diseño de datos, y pala la lñógica de trazabilidad de acciones, lo que te propone es correcto.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 18/04/2013, 13:06
 
Fecha de Ingreso: mayo-2009
Mensajes: 232
Antigüedad: 14 años, 11 meses
Puntos: 3
Respuesta: Simplificar Consulta

-La tabla es como el la describio, y lo dige, nose pq debo volver a postearla.

-Si se trata de otra estructura, por favor agradeceria que me enseñarais la optimizacion de estructura que hariais.

-Lo de la programacion soolo lo digo porque necesito ayuda en la consulta y doy info.
  #6 (permalink)  
Antiguo 18/04/2013, 13:14
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, 4 meses
Puntos: 2658
Respuesta: Simplificar Consulta

Bueno, en tema es que en el ámbito de las bases de datos, las descripciones no nos sirven para nada. Sólo trabajamos con cosas concretas. por eso pedimos la estructura, y por tal nos referimos al CREATE TABLE que la genera, y si es posible un conjunto de datos de prueba (varios INSERT de registros).
Sin ese tipo de cosas, es difícil reproducir el problema fielmente, y menos aún dar consultas sugeridas.

En cuando a lo de normalizar, bueno, sin ver la estructura de la tabla, y una idea mínima del sistema.. no hay quien te pueda dar sugerencias... ¿No te parece?

Lo de programación es una norma de este subforo, que puedes leer en un post al efecto en la raiz del foro: No se permite postear código de programación ni se tratan temas de eso.
Era simplemente una observación aclaratoria.

Veamos qué opina Leo de lo que le escribiste.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 18/04/2013, 13:23
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Simplificar Consulta

Hola de nuevo:

Tal como lo menciona gnzsoloyo, sin que nos des información más concreta de cómo tienes tu tabla y tus datos, es difícil decirte si tienes algo mal con tu diseño... por ejemplo me parece una barbaridad que para contabilizar los puntos de un jugador tengas que hacer un update a tu tabla... esto es un error de diseño, pero para poder plantear un mejor modelo tendríamos que saber más acerca de lo que estás haciendo... por lo pronto, partiendo de los datos que puse de ejemplo

Código MySQL:
Ver original
  1. mysql> SELECT jugador, puntos,
  2.     -> ( SELECT COUNT(id)
  3.     ->   FROM tabla
  4.     ->   WHERE puntos > 1000
  5.     -> ) posicion
  6.     -> FROM tabla WHERE puntos > 1000 ORDER BY puntos LIMIT 1;
  7. +---------+--------+----------+
  8. | jugador | puntos | posicion |
  9. +---------+--------+----------+
  10. | cinco   |   1001 |        3 |
  11. +---------+--------+----------+
  12. 1 row in set (0.00 sec)

de esta manera obtienes el contrincante y la posición que ocupa...

en cuanto al T1 y T2 en la consulta previa esos son ALIAS, sólo eso... me soprende que no entiendas de que se trata.

Saludos
Leo.

Etiquetas: campo, simplificar, sql, tabla
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 04:31.