entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

1voto

No me funciona Consulta SQL que antes si lo hacía

Buenos Días, tengo un gran problema con una consulta que antes me funcionaba perfectamente pero ahora no da error pero no muestra los datos:
mi consulta problemática me retorna las noticias más visitadas de entre varias tablas, de los últimos 7 días y uniendola con unión, antes me funcionaba al 100% pero ahora no hace nada y no he cambiado nada, incluso la estoy corriendo en el cliente de mysql y no da nada:
Consulta SQL:

SELECT titulo,visitas,fecha From news11 WHERE DATEDIFF(CURDATE(), STR_TO_DATE(Fecha, '%Y/%m/%d')) <= 6 AND tipo = 'noticia' 
UNION SELECT titulo,visitas,fecha From news12 WHERE DATEDIFF(CURDATE(), STR_TO_DATE(Fecha, '%Y/%m/%d')) <= 6 AND tipo = 'noticia' 
UNION SELECT titulo,visitas,fecha From news13 WHERE DATEDIFF(CURDATE(), STR_TO_DATE(Fecha, '%Y/%m/%d')) <= 6 AND tipo = 'noticia' 
ORDER BY visitas DESC LIMIT 7

Saludos Dairon

0voto

carlossevi comentado

Si estás seguro de que las tablas tienen datos prueba a ejecutar la consulta sin filtrar y muestra los valores CURDATE() y STR_TO_DATE(Fecha, '%Y/%m/%d') por separado y el correspondiente DATEDIFF() para ver si detectas algún problema con la configuración de fecha del servidor de MySQL o el origen del problema.

0voto

dairon comentado

man yo inserté ahora unas noticias y si me aparecieron en las mas visitadas, es que se me había olvidado el curdate(), esto busca noticias a partir del día de hoy hasta seis dias antes sin contar este y mis datos de prueba eran viejos, existe alguna forma que me busque noticias de los ultimos 7 dias sin tener en cuenta cual es el día de hoy. ??

1 Respuesta

3votos

carlossevi Puntos63580

Si no quieres seleccionar las noticias de "hoy" puedes cambiar el DATEDIFF(...) <= 6 por DATEDIFF(...) BETWEEN 1 AND 6 y así desestimas las difencias de cero días (las del día de hoy).

0voto

dairon comentado

y que hago con el current_day ??

0voto

carlossevi comentado

No entiendo lo que preguntas ¿no quieres seleccionar los últimos 7 días sin tener en cuenta el día de hoy? En ese caso el CURDATE() funciona bien con el BETWEEN.

0voto

dairon comentado

no me funciona, no me devuelve dato mano

0voto

carlossevi comentado

Comprueba qué valores devuelven tus registros para la expresión DATEDIFF(...) ¿no tienes valores entre 1 y 6?

0voto

dairon comentado

mano lo puse de esta forma:

SELECT titulo,visitas,fecha From news9 WHERE DATEDIFF(CURDATE(), STR_TO_DATE(Fecha, '%Y/%m/%d')) BETWEEN 1 AND 6 AND tipo = 'noticia' 
UNION SELECT titulo,visitas,fecha From news12 WHERE DATEDIFF(CURDATE(), STR_TO_DATE(Fecha, '%Y/%m/%d')) BETWEEN 1 AND 6 AND tipo = 'noticia' 
UNION SELECT titulo,visitas,fecha From news13 WHERE DATEDIFF(CURDATE(), STR_TO_DATE(Fecha, '%Y/%m/%d')) BETWEEN 1 AND 6 AND tipo = 'noticia' ORDER BY visitas DESC LIMIT 7

0voto

dairon comentado

especificamente busca los valores entre 1 y 6 ?? mano yo necesito que me filtre los valores de los ultimos 7 dias almacenados en la data base sin importar el dia de hoy.

0voto

carlossevi comentado

¿Y qué últimos 7 días quieres? Para hablar de últimos N días es imprescindible tomar una fecha de referencia.

¿Quieres los 7 últimos días que tengan noticias aunque no sean consecutivos? ¿Quieres 7 días consecutivos a partir de la última fecha en que haya una noticia publicada? ¿Los 7 últimos días pares? ¿Los 7 últimos días de luna llena? Aclara la cuestión e intentaremos ayudarte.

0voto

dairon comentado

mano con lo estresado que estoy me hiciste reir, "los día de luna llena", gracias mano, necesito los últimos 7 días que tengan noticias aunque no sean consecutivos. es posible ??

0voto

carlossevi comentado

El humor también es importante =)

La consulta que pides es un poco más difícil de lo que parece ya que se necesita una subconsulta que devuelva los últimos 7 días, pero la cosa se complica todavía más al tener los datos repartidos por varias tablas (news1, news2...) ¿ves ahora los problemas de no normalizar una base de datos?

Te lo hago para sólo una tabla de noticias:

SELECT titulo,visitas,fecha FROM news1
WHERE fecha IN (SELECT fecha FROM news1 ORDER BY fecha Desc GROUP BY fecha LIMIT 0,7)

La he hecho sin probrarla así que puede tener algún errorcillo, compruébala.

0voto

dairon comentado

me estoy machucando, realmente lo voy a dejar con el current_date si de todas formas el sitio se actualiza diario, gracias mano, luego implementaré de esta manera ya que me gusta más, es general

0voto

carlossevi comentado

Yo para el futuro estudiaría la forma de evitar el uso de tantas tablas para guardar datos del mismo tipo porque solo da dolores de cabeza. Si todo son noticias ¿por qué no utilizar una única tabla "news"? La categoría podría ser una columna indizada.

Solo me plantearía duplicar tablas en el caso de que se acumulen muchos registros con el paso del tiempo y esto deteriore el rendimiento, pero serían tablas de archivo o históricos que ya no se consulten en la aplicación, por ejemplo news_archive o incluso news_archive_2013 si el volumen fuera bestial.

0voto

dairon comentado

mano así era la base de datos vieja que mantengo en el sitio pero ya tenía más de 60K de noticias

0voto

carlossevi comentado

¿Se demoran mucho las consultas con 60K registros sobre la tabla de noticias? En la aplicación que mantengo día a día hay tablas de >20 millones de registros, aunque claro, no es un CMS =)

La clave en el caso de la tabla de noticias es identificar el momento en el que deja de ser relevante tenerla en la tabla principal (es decir, que ya no tengan visibilidad, muy poco tráfico, relevancia...) y archivarlas para la consulta de hemeroteca donde es menos crítico el rendimiento.

0voto

dairon comentado

mano ya terminé mi sitio y lo publiqué esta es la url esta en face de pruebas http://www.radiosantacruz.icrt.cu/es

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta