Ayuda con una consulta SQL

21/07/2004 - 09:31 por Jaime Pérez | Informe spam
Hola:

A ver si me podeis ayudar con esta consulta SQL
Tengo una tabla con titulares de noticias, con una fecha y que pertenecen a
un seccion. Por otro lado tengo una tabla con los nombres de las secciones
que existen y el orden en que se deben presentar:

Tabla Secciones
seccion varchar
orden int

Tabla noticias
id int
titular varchar
fecha datetime
seccion varchar

Quiero obtener en una consulta, por cada sección ordenada por el campo orden
la última noticia de hoy (sólo una, obtenida a partir del campo fecha o
ultimo id si hay varias de hoy).

¿alguna idea de consulta?

Preguntas similare

Leer las respuestas

#1 Carlos Sacristan
21/07/2004 - 09:58 | Informe spam
Como siempre, hay varias opciones, pero una posible solución puede ser
la siguiente:

SELECT s.seccion, s.orden, n.titular, n.fecha
FROM secciones s INNER JOIN noticia n ON s.seccion=n.seccion INNER
(SELECT MAX(fecha) maxFecha,seccion FROM noticia GROUP BY
seccion) mF ON mF.maxFecha=n.fecha AND mf.seccion=n.seccion
ORDER BY s.orden

En esta consulta se sobreentiende que la hora también la estás enviando
al grabar los datos. Eso sí, si no tienes un índice sobre el campo fecha de
la noticia, yo se lo pondría para mejorar el rendimiento...


Un saludo

-
"Sólo sé que no sé nada. " (Sócrates)

Por favor, responder únicamente al foro
Se agradece la inclusión de sentencias DDL


"Jaime Pérez" escribió en el mensaje
news:#
Hola:

A ver si me podeis ayudar con esta consulta SQL
Tengo una tabla con titulares de noticias, con una fecha y que pertenecen


a
un seccion. Por otro lado tengo una tabla con los nombres de las secciones
que existen y el orden en que se deben presentar:

Tabla Secciones
seccion varchar
orden int

Tabla noticias
id int
titular varchar
fecha datetime
seccion varchar

Quiero obtener en una consulta, por cada sección ordenada por el campo


orden
la última noticia de hoy (sólo una, obtenida a partir del campo fecha o
ultimo id si hay varias de hoy).

¿alguna idea de consulta?




Respuesta Responder a este mensaje
#2 Jaime Pérez
21/07/2004 - 10:29 | Informe spam
Muchas gracias... ¡FUNCIONA PERFECTO!

A ver si consigo entenderlo correctamente la consulta...

Un saludo,

Jaime Pérez


"Carlos Sacristan" <csacristan ARROBA mvps.org> escribió en el mensaje
news:
Como siempre, hay varias opciones, pero una posible solución puede ser
la siguiente:

SELECT s.seccion, s.orden, n.titular, n.fecha
FROM secciones s INNER JOIN noticia n ON s.seccion=n.seccion INNER
(SELECT MAX(fecha) maxFecha,seccion FROM noticia GROUP BY
seccion) mF ON mF.maxFecha=n.fecha AND mf.seccion=n.seccion
ORDER BY s.orden

En esta consulta se sobreentiende que la hora también la estás


enviando
al grabar los datos. Eso sí, si no tienes un índice sobre el campo fecha


de
la noticia, yo se lo pondría para mejorar el rendimiento...


Un saludo

-
"Sólo sé que no sé nada. " (Sócrates)

Por favor, responder únicamente al foro
Se agradece la inclusión de sentencias DDL


"Jaime Pérez" escribió en el mensaje
news:#
> Hola:
>
> A ver si me podeis ayudar con esta consulta SQL
> Tengo una tabla con titulares de noticias, con una fecha y que


pertenecen
a
> un seccion. Por otro lado tengo una tabla con los nombres de las


secciones
> que existen y el orden en que se deben presentar:
>
> Tabla Secciones
> seccion varchar
> orden int
>
> Tabla noticias
> id int
> titular varchar
> fecha datetime
> seccion varchar
>
> Quiero obtener en una consulta, por cada sección ordenada por el campo
orden
> la última noticia de hoy (sólo una, obtenida a partir del campo fecha o
> ultimo id si hay varias de hoy).
>
> ¿alguna idea de consulta?
>
>
>
>


Respuesta Responder a este mensaje
#3 Carlos Sacristan
21/07/2004 - 11:05 | Informe spam
Un truco: tú simplemente piensa cómo harías para seleccionar esos datos
(no hablamos de SQL, sino las condiciones que cumplen los datos que
necesitas) y luego es cuestión de ir solucionando los problemas poco a poco,
no todo de golpe.

Si no entiendes lo que hago en la consulta, dilo y te lo explicamos...


Un saludo

-
"Sólo sé que no sé nada. " (Sócrates)

Por favor, responder únicamente al foro
Se agradece la inclusión de sentencias DDL


"Jaime Pérez" escribió en el mensaje
news:
Muchas gracias... ¡FUNCIONA PERFECTO!

A ver si consigo entenderlo correctamente la consulta...

Un saludo,

Jaime Pérez


"Carlos Sacristan" <csacristan ARROBA mvps.org> escribió en el mensaje
news:
> Como siempre, hay varias opciones, pero una posible solución puede


ser
> la siguiente:
>
> SELECT s.seccion, s.orden, n.titular, n.fecha
> FROM secciones s INNER JOIN noticia n ON s.seccion=n.seccion


INNER
> (SELECT MAX(fecha) maxFecha,seccion FROM noticia GROUP


BY
> seccion) mF ON mF.maxFecha=n.fecha AND mf.seccion=n.seccion
> ORDER BY s.orden
>
> En esta consulta se sobreentiende que la hora también la estás
enviando
> al grabar los datos. Eso sí, si no tienes un índice sobre el campo fecha
de
> la noticia, yo se lo pondría para mejorar el rendimiento...
>
>
> Un saludo
>
> -
> "Sólo sé que no sé nada. " (Sócrates)
>
> Por favor, responder únicamente al foro
> Se agradece la inclusión de sentencias DDL
>
>
> "Jaime Pérez" escribió en el mensaje
> news:#
> > Hola:
> >
> > A ver si me podeis ayudar con esta consulta SQL
> > Tengo una tabla con titulares de noticias, con una fecha y que
pertenecen
> a
> > un seccion. Por otro lado tengo una tabla con los nombres de las
secciones
> > que existen y el orden en que se deben presentar:
> >
> > Tabla Secciones
> > seccion varchar
> > orden int
> >
> > Tabla noticias
> > id int
> > titular varchar
> > fecha datetime
> > seccion varchar
> >
> > Quiero obtener en una consulta, por cada sección ordenada por el campo
> orden
> > la última noticia de hoy (sólo una, obtenida a partir del campo fecha


o
> > ultimo id si hay varias de hoy).
> >
> > ¿alguna idea de consulta?
> >
> >
> >
> >
>
>


Respuesta Responder a este mensaje
#4 Jaime Pérez
22/07/2004 - 09:43 | Informe spam
Gracias, Carlos.

Me costaba entender esta parte:
(SELECT MAX(fecha) maxFecha,seccion FROM noticia GROUP BY seccion) mF
que veo que asignas el resultado de una select a "una especie de tabla
virtual" para luego utilizar sus resultados para compararlos en
ON mF.maxFecha=n.fecha AND mf.seccion=n.seccion ORDER BY s.orden

No sabía que se podía hacer eso...

Trabajo con ASP y normalmente hago consultas acumuladas, es decir, que en
este caso habría sacado la lista de secciones en una consulta y luego, con
el ASP, por cada seccion, habría obtenido el titular más moderno. Esto
suponía que era menos eficiente que la consulta que me has fabricado, por
eso el preguntaros...

¿Me recomiendas algún manual o, preferiblemente, web, que me ayude más a
entender estas cosas? Los BOL no me ayudan mucho a entender el T-SQL porque
son simples listas de funciones... En estos foros se aprende mucho pero
nunca está de más algo de información extra...

Muchas gracias por vuestra ayuda...

Un saludo,

Jaime Pérez

"Carlos Sacristan" <csacristan ARROBA mvps.org> escribió en el mensaje
news:
Un truco: tú simplemente piensa cómo harías para seleccionar esos


datos
(no hablamos de SQL, sino las condiciones que cumplen los datos que
necesitas) y luego es cuestión de ir solucionando los problemas poco a


poco,
no todo de golpe.

Si no entiendes lo que hago en la consulta, dilo y te lo explicamos...


Un saludo

-
"Sólo sé que no sé nada. " (Sócrates)

Por favor, responder únicamente al foro
Se agradece la inclusión de sentencias DDL


"Jaime Pérez" escribió en el mensaje
news:
> Muchas gracias... ¡FUNCIONA PERFECTO!
>
> A ver si consigo entenderlo correctamente la consulta...
>
> Un saludo,
>
> Jaime Pérez
>
>
> "Carlos Sacristan" <csacristan ARROBA mvps.org> escribió en el mensaje
> news:
> > Como siempre, hay varias opciones, pero una posible solución puede
ser
> > la siguiente:
> >
> > SELECT s.seccion, s.orden, n.titular, n.fecha
> > FROM secciones s INNER JOIN noticia n ON s.seccion=n.seccion
INNER
> > (SELECT MAX(fecha) maxFecha,seccion FROM noticia GROUP
BY
> > seccion) mF ON mF.maxFecha=n.fecha AND mf.seccion=n.seccion
> > ORDER BY s.orden
> >
> > En esta consulta se sobreentiende que la hora también la estás
> enviando
> > al grabar los datos. Eso sí, si no tienes un índice sobre el campo


fecha
> de
> > la noticia, yo se lo pondría para mejorar el rendimiento...
> >
> >
> > Un saludo
> >
> > -
> > "Sólo sé que no sé nada. " (Sócrates)
> >
> > Por favor, responder únicamente al foro
> > Se agradece la inclusión de sentencias DDL
> >
> >
> > "Jaime Pérez" escribió en el mensaje
> > news:#
> > > Hola:
> > >
> > > A ver si me podeis ayudar con esta consulta SQL
> > > Tengo una tabla con titulares de noticias, con una fecha y que
> pertenecen
> > a
> > > un seccion. Por otro lado tengo una tabla con los nombres de las
> secciones
> > > que existen y el orden en que se deben presentar:
> > >
> > > Tabla Secciones
> > > seccion varchar
> > > orden int
> > >
> > > Tabla noticias
> > > id int
> > > titular varchar
> > > fecha datetime
> > > seccion varchar
> > >
> > > Quiero obtener en una consulta, por cada sección ordenada por el


campo
> > orden
> > > la última noticia de hoy (sólo una, obtenida a partir del campo


fecha
o
> > > ultimo id si hay varias de hoy).
> > >
> > > ¿alguna idea de consulta?
> > >
> > >
> > >
> > >
> >
> >
>
>


Respuesta Responder a este mensaje
#5 Carlos Sacristan
22/07/2004 - 09:58 | Informe spam
No es que sea una "tabla virtual" esa sentencia, sino un conjunto de
resultados, al igual que una tabla o una vista. Por eso la sintaxis es
perfectamente válida.

Yo creo que el manual de Fernando Guerrero: "SQL Server 2000: con
ejemplos" es un muy buen libro para usuarios medios, muy didáctico y fácil
de aprender. Eso sí, aunque es ya de nivel avanzado, es imprescindible el de
Kalen Delaney "A fondo SQL Server 2000": aunque algunos capítulos son muy
densos, hay otros, como por ejemplo el de optimización de consultas, que
aclaran muchísimos conceptos.

Y por supuesto no dejes de leer los foros. Te aseguro que lo que se
aprende aquí no tiene precio...


Un saludo

-
"Sólo sé que no sé nada. " (Sócrates)

Por favor, responder únicamente al foro
Se agradece la inclusión de sentencias DDL


"Jaime Pérez" escribió en el mensaje
news:
Gracias, Carlos.

Me costaba entender esta parte:
(SELECT MAX(fecha) maxFecha,seccion FROM noticia GROUP BY seccion) mF
que veo que asignas el resultado de una select a "una especie de tabla
virtual" para luego utilizar sus resultados para compararlos en
ON mF.maxFecha=n.fecha AND mf.seccion=n.seccion ORDER BY s.orden

No sabía que se podía hacer eso...

Trabajo con ASP y normalmente hago consultas acumuladas, es decir, que en
este caso habría sacado la lista de secciones en una consulta y luego, con
el ASP, por cada seccion, habría obtenido el titular más moderno. Esto
suponía que era menos eficiente que la consulta que me has fabricado, por
eso el preguntaros...

¿Me recomiendas algún manual o, preferiblemente, web, que me ayude más a
entender estas cosas? Los BOL no me ayudan mucho a entender el T-SQL


porque
son simples listas de funciones... En estos foros se aprende mucho pero
nunca está de más algo de información extra...

Muchas gracias por vuestra ayuda...

Un saludo,

Jaime Pérez

"Carlos Sacristan" <csacristan ARROBA mvps.org> escribió en el mensaje
news:
> Un truco: tú simplemente piensa cómo harías para seleccionar esos
datos
> (no hablamos de SQL, sino las condiciones que cumplen los datos que
> necesitas) y luego es cuestión de ir solucionando los problemas poco a
poco,
> no todo de golpe.
>
> Si no entiendes lo que hago en la consulta, dilo y te lo


explicamos...
>
>
> Un saludo
>
> -
> "Sólo sé que no sé nada. " (Sócrates)
>
> Por favor, responder únicamente al foro
> Se agradece la inclusión de sentencias DDL
>
>
> "Jaime Pérez" escribió en el mensaje
> news:
> > Muchas gracias... ¡FUNCIONA PERFECTO!
> >
> > A ver si consigo entenderlo correctamente la consulta...
> >
> > Un saludo,
> >
> > Jaime Pérez
> >
> >
> > "Carlos Sacristan" <csacristan ARROBA mvps.org> escribió en el mensaje
> > news:
> > > Como siempre, hay varias opciones, pero una posible solución


puede
> ser
> > > la siguiente:
> > >
> > > SELECT s.seccion, s.orden, n.titular, n.fecha
> > > FROM secciones s INNER JOIN noticia n ON s.seccion=n.seccion
> INNER
> > > (SELECT MAX(fecha) maxFecha,seccion FROM noticia


GROUP
> BY
> > > seccion) mF ON mF.maxFecha=n.fecha AND mf.seccion=n.seccion
> > > ORDER BY s.orden
> > >
> > > En esta consulta se sobreentiende que la hora también la estás
> > enviando
> > > al grabar los datos. Eso sí, si no tienes un índice sobre el campo
fecha
> > de
> > > la noticia, yo se lo pondría para mejorar el rendimiento...
> > >
> > >
> > > Un saludo
> > >
> > > -
> > > "Sólo sé que no sé nada. " (Sócrates)
> > >
> > > Por favor, responder únicamente al foro
> > > Se agradece la inclusión de sentencias DDL
> > >
> > >
> > > "Jaime Pérez" escribió en el mensaje
> > > news:#
> > > > Hola:
> > > >
> > > > A ver si me podeis ayudar con esta consulta SQL
> > > > Tengo una tabla con titulares de noticias, con una fecha y que
> > pertenecen
> > > a
> > > > un seccion. Por otro lado tengo una tabla con los nombres de las
> > secciones
> > > > que existen y el orden en que se deben presentar:
> > > >
> > > > Tabla Secciones
> > > > seccion varchar
> > > > orden int
> > > >
> > > > Tabla noticias
> > > > id int
> > > > titular varchar
> > > > fecha datetime
> > > > seccion varchar
> > > >
> > > > Quiero obtener en una consulta, por cada sección ordenada por el
campo
> > > orden
> > > > la última noticia de hoy (sólo una, obtenida a partir del campo
fecha
> o
> > > > ultimo id si hay varias de hoy).
> > > >
> > > > ¿alguna idea de consulta?
> > > >
> > > >
> > > >
> > > >
> > >
> > >
> >
> >
>
>


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