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

#1 Gustavo Larriera [MVP SQL]
28/05/2004 - 20:56 | Informe spam
La query es "picante" dices... no me quiero imaginar el contenido de esas
imágenes!!! :-) :-)

Gustavo Larriera, MVP-SQL, MCSE
Uruguay LatAm
Este mensaje se proporciona "COMO ESTA" sin garantias y no otorga ningun
derecho / This posting is provided "AS IS" with no warranties, and confers
no rights.
"José G. Díaz U." wrote in message
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



Respuesta Responder a este mensaje
#2 ulises
28/05/2004 - 21:12 | Informe spam
Hum ... entonces creo que para resolverlo vamos a
necesitar algunos datos para probar ;) ...

Saludos,
Ulises

La query es "picante" dices... no me quiero imaginar el


contenido de esas
imágenes!!! :-) :-)

Gustavo Larriera, MVP-SQL, MCSE
Uruguay LatAm
Este mensaje se proporciona "COMO ESTA" sin garantias y


no otorga ningun
derecho / This posting is provided "AS IS" with no


warranties, and confers
no rights.
"José G. Díaz U." wrote in message
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







.

Respuesta Responder a este mensaje
#3 José G. Díaz U.
28/05/2004 - 22:02 | Informe spam
:)

Menos acá que de allá :Den realidad le puse picante porque ya me picaba
la cabeza de tanto rascarmela pensando en cómo resolverlo :D

Estos son los datos de la tabla BANNER:

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

Gracias amigos!

Joe

"ulises" escribió en el mensaje
news:148b101c444e7$b47fe030$
Hum ... entonces creo que para resolverlo vamos a
necesitar algunos datos para probar ;) ...

Saludos,
Ulises

La query es "picante" dices... no me quiero imaginar el


contenido de esas
imágenes!!! :-) :-)

Gustavo Larriera, MVP-SQL, MCSE
Uruguay LatAm
Este mensaje se proporciona "COMO ESTA" sin garantias y


no otorga ningun
derecho / This posting is provided "AS IS" with no


warranties, and confers
no rights.
"José G. Díaz U." wrote in message
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







.

Respuesta Responder a este mensaje
#4 Javier Loria
29/05/2004 - 01:04 | Informe spam
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
#5 José G. Díaz U.
29/05/2004 - 06:14 | Informe spam
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
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida