Query Picante

28/05/2004 - 20:43 por José G. Díaz U. | Informe spam
Saludos y gracias de antemano.

Tengo estos datos:

37 logo-ux.jpg 1 1
38 tit_la_encuesta.gif 2 1
39 encuesta_03.gif 3 0
40 logoCampusxity.gif 4 1
41 ctv.bmp 5 1
42 b1.png 6 1
43 books2a[1].gif 3 1
44 pinup0b[1].gif 1 1
45 starwars[1].gif 5 1
46 slogan.gif 1 1
47 logopeq.gif 1 1

y estos son los campos:

idbanner int
Nombre varchar
IdPosicion int
Activo bit

La idea es seleccionar 6 registros ALEATORIOS cuyo ACTIVO = 1 pero no pueden
repetirse el IdPosicion.

Hasta ahora he logrado esto:

select top 6 *
from banner
where Activo = 1
order by newid()

...y funciona pero me repite los IdPosicion como se puede ver a continuación
(repite en este caso el 1):

44 pinup0b[1].gif 1 1
41 ctv.bmp 5 1
46 slogan.gif 1 1
37 logo-ux.jpg 1 1
42 b1.png 6 1
38 tit_la_encuesta.gif 2 1

Qué cambios tendría que hacer para que no se repita?

Gracias!

Joe

Preguntas similare

Leer las respuestas

#6 Javier Loria
29/05/2004 - 20:53 | Informe spam
Hola Jose:
Creo que lo tienes CLARISIMO.
Un par de notas, es que el [3] es que son del tipo de subconsultas
"lentas", o sea de las que se hacen n veces, para poder obtener en
resultado pero con menos de 100 filas ni cuenta te das.
Por otra parte el * no es buena practica, pero andaba corriento.
Saludos,

Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.

José G. Díaz U. escribio:
Saludos Javier!

Estaba a un paso :)...tenía soluciones aisladas pero tu las
concentraste!!!..gracias!!

Voy a colocar la explicación de mi razonamiento y si interpreto algo
mal te agradezco me corrjas:

Voy a ponerle un paréntesis y un numerito para que te ubiques en la
explicación en el SELECT pero tu quítaselo cuando lo pases al SP:

SELECT[4] Banner.*
FROM Banner JOIN
(SELECT[3] (SELECT[1] TOP 1 IdBanner
FROM Banner
WHERE IdPosicion=Pos.IdPosicion and Activo = 1
ORDER BY NEWID()) AS IdBanner
FROM (SELECT[2] DISTINCT IdPosicion
FROM Banner) AS Pos
) AS B2
ON Banner.IdBanner².IdBanner

1) Con el Select[1], Select[2] y Select[3] construyes aleatoriamente
una tablita que tiene IdBanner co un una cantidad de registros igual
al número de IdPosicion. Es decir, se crea una lista con el distinct
de todas las posiciones posibles y luego se le asigna aleatoriamente
un IdBanner que esté activo.
2) Finalmente con el Select[4] te relacionas los campitos que te
faltan con la tabla creada en el subquery anterior.

Voy a exponer la idea de esto ya que creo que muchos de los que
trabajamos con Banners para los patrocinantes pueden ver una
oportunidad con este código:

La idea es poder variar aleatoriamente los banners que aparecen en una
página web. Cada IdPosicion referencia un banner en la página en
cuestión. Con esto uno se quita el dolorcito de cabeza de tener que
estar editando la página para cambiar los banners.

Javier una vez más gracias por tu ayuda!

Joe

"Javier Loria" escribió en el mensaje
news:
Hola Jose:
Muy bonito problema, prueba con:
>> SELECT Banner.*
FROM Banner JOIN
(SELECT (SELECT TOP 1 IdBanner
FROM Banner
WHERE IdPosicion=Pos.IdPosicion
ORDER BY NEWID()) AS IdBanner
FROM (SELECT DISTINCT IdPosicion
FROM Banner) AS Pos
) AS B2
ON Banner.IdBanner².IdBanner
>> Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
José G. Díaz U. escribio:
Saludos y gracias de antemano.

Tengo estos datos:

37 logo-ux.jpg 1 1
38 tit_la_encuesta.gif 2 1
39 encuesta_03.gif 3 0
40 logoCampusxity.gif 4 1
41 ctv.bmp 5 1
42 b1.png 6 1
43 books2a[1].gif 3 1
44 pinup0b[1].gif 1 1
45 starwars[1].gif 5 1
46 slogan.gif 1 1
47 logopeq.gif 1 1

y estos son los campos:

idbanner int
Nombre varchar
IdPosicion int
Activo bit

La idea es seleccionar 6 registros ALEATORIOS cuyo ACTIVO = 1 pero
no pueden repetirse el IdPosicion.

Hasta ahora he logrado esto:

select top 6 *
from banner
where Activo = 1
order by newid()

...y funciona pero me repite los IdPosicion como se puede ver a
continuación (repite en este caso el 1):

44 pinup0b[1].gif 1 1
41 ctv.bmp 5 1
46 slogan.gif 1 1
37 logo-ux.jpg 1 1
42 b1.png 6 1
38 tit_la_encuesta.gif 2 1

Qué cambios tendría que hacer para que no se repita?

Gracias!

Joe
Respuesta Responder a este mensaje
#7 José G. Díaz U.
30/05/2004 - 05:46 | Informe spam
Gracias Javier!

Suerte!

Joe

"José G. Díaz U." escribió en el mensaje
news:
Saludos y gracias de antemano.

Tengo estos datos:

37 logo-ux.jpg 1 1
38 tit_la_encuesta.gif 2 1
39 encuesta_03.gif 3 0
40 logoCampusxity.gif 4 1
41 ctv.bmp 5 1
42 b1.png 6 1
43 books2a[1].gif 3 1
44 pinup0b[1].gif 1 1
45 starwars[1].gif 5 1
46 slogan.gif 1 1
47 logopeq.gif 1 1

y estos son los campos:

idbanner int
Nombre varchar
IdPosicion int
Activo bit

La idea es seleccionar 6 registros ALEATORIOS cuyo ACTIVO = 1 pero no


pueden
repetirse el IdPosicion.

Hasta ahora he logrado esto:

select top 6 *
from banner
where Activo = 1
order by newid()

...y funciona pero me repite los IdPosicion como se puede ver a


continuación
(repite en este caso el 1):

44 pinup0b[1].gif 1 1
41 ctv.bmp 5 1
46 slogan.gif 1 1
37 logo-ux.jpg 1 1
42 b1.png 6 1
38 tit_la_encuesta.gif 2 1

Qué cambios tendría que hacer para que no se repita?

Gracias!

Joe



email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida