Test Foro de elhacker.net SMF 2.1

Programación => Desarrollo Web => Bases de Datos => Mensaje iniciado por: Skeletron en 11 Enero 2011, 02:27 AM

Título: Como puedo realizar esta consulta?
Publicado por: Skeletron en 11 Enero 2011, 02:27 AM
Hola gente.
Resulta que, quiero hacer en 1 sola consulta esto:
Traer los 10 ID de usuarios de RANKING MAYOR al RANKING de un usuario especificio, y los 10 ID de usuario de de RANKING MENOR al ID del mismo usuario (mencionado antes)

Tengo pensado hacer algo así:
Código (sql) [Seleccionar]
SELECT id
FROM usuarios
WHERE ranking BETWEEN(
                                     (SELECT ranking FROM usuario WHERE id=1) + 10
                                     AND
                                     (SELECT ranking FROM usuario WHERE id=1) - 10
                                 )


Pero como tengo 2 subconsultas iguales, me resulta raro, y tambien se ve SUCIA la consulta.
Hay manera de hacerla mejor? pero que mantenga un buen rendimiento.

Saludos, y gracias
Título: Re: Como puedo realizar esta consulta?
Publicado por: Novlucker en 11 Enero 2011, 10:23 AM
Estas realizando dos veces la misma consulta, ejecuta primero el "SELECT ranking FROM usuario WHERE id=1", almacenalo en una variable y luego si usala en tu segunda consulta.

Saludos
Título: Re: Como puedo realizar esta consulta?
Publicado por: KuraraGNU en 11 Enero 2011, 16:44 PM
Código (sql) [Seleccionar]
SELECT usuarios.id
FROM usuarios
WHERE ranking IN(
                            SELECT ranking FROM usuario WHERE usuario.id
                            BETWEEN usuarios.id-10 AND usuarios.id+10
                          )


Pero que yo el between no lo uso mucho, no se si estará bien su sintáxis, uso el IN más. Ejecutalo y si te da error o no he comprendido bien en enunciado me lo dices ^^ De hecho creo que no lo he hecho bien... Dime que da cuando lo ejecutas, por favor, así sabré como modificarlo.
Título: Re: Como puedo realizar esta consulta?
Publicado por: Skeletron en 11 Enero 2011, 20:02 PM
Cita de: Novlucker en 11 Enero 2011, 10:23 AM
Estas realizando dos veces la misma consulta, ejecuta primero el "SELECT ranking FROM usuario WHERE id=1", almacenalo en una variable y luego si usala en tu segunda consulta.

Saludos

Ya se que estoy ejecutando la misma consulta. Pero, como hago para ponerlo en una variable antes?

Cita de: KuraraGNU en 11 Enero 2011, 16:44 PM
Código (sql) [Seleccionar]
BETWEEN usuarios.id-10 AND usuarios.id+10

Y eso?
Título: Re: Como puedo realizar esta consulta?
Publicado por: KuraraGNU en 11 Enero 2011, 20:47 PM
Cita de: Skeletron en 11 Enero 2011, 20:02 PM
Y eso?

Pues comprueba que el id del usuario esté entre 10 ids arriba y 10 ids abajo del id de los usuarios. ¿que no entiendes?
Título: Re: Como puedo realizar esta consulta?
Publicado por: Novlucker en 11 Enero 2011, 22:59 PM
Lo que ocurre KuraraGNU es que tu estas consultando +/- 10 ID de usuario en base a un ID, pero el necesita +/- 10 ID de usuario cuyo ranking esten más o menos 10 lugares.

Imagina un ranking con 50 lugares, el tipo en el lugar 30 y tu quieres los que estan 10 lugares antes, y los que estan 10 después.
Skeletron
Código (sql) [Seleccionar]
declare @Rank int
SELECT @Rank=ranking FROM usuario WHERE id=1
SELECT usuarios.id FROM usuarios WHERE ranking BETWEEN (@Rank-10) AND (@Rank+10)


También podrías hacerlo con consultas individuales y UNION, pero no creo que valga la pena :P

Saludos
Título: Re: Como puedo realizar esta consulta?
Publicado por: Skeletron en 12 Enero 2011, 23:50 PM
Muchas gracias Novluker.
Voy a tenerlo en cuenta.

Esa variable, queda para siempre? para el usuario? que onda?
Tengo las sesiones abiertas en PHP con mysql_Pconnect. así que creo que va a funcionar bien si la variable queda en la sesion
Título: Re: Como puedo realizar esta consulta?
Publicado por: Novlucker en 13 Enero 2011, 04:00 AM
Se supone que es temporal y que muere una vez son retornados los datos de la consulta :P

Saludos