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

2votos

Obtener último año de un campo con sql

Tengo una tabla de un concurso que funciona por votos. Quiero obtener el usuario que mayor número de votos tenga y a su vez sea del mes anterior al que estamos.

Es decir, me va a ir mostrando registros de usuarios con mayor número de votos en los meses anteriores al actual. Contando también los años, ya que si estamos en 2014 y llega a Enero, que después sea Diciembre 2013, etc.

¿De qué manera puedo obtener esos datos con PHP? Sé que tengo que hacer un bucle, pero no exactamente como hacer el SQL.

1 Respuesta

1voto

Leonardo-Tadei Puntos227320

Hola Daniel,

no deberías tener que hacer ningún bucle en PHP ni recorrer ningún resultado, ya que una query da el dato que requerís. Sería algo como:

SELECT COUNT(votos) as votos_totales
FROM Tabla
WHERE fecha >= '$primer_dia_mes_anterior'
AND fecha <= '$ultimo_dia_mes_anterior'
ORDER BY COUNT(votos) DESC
LIMIT 1,1.

Esta misma query sin el LIMIT te devuelve ordenados de mayor a menor todos los usuarios por su cantidad de votos, y en ese caso, sí tendrías que recorrer la salida para mostrarlos.

Me estoy inventando los nombres de tablas y campos, que tendrás que ajustar a los tuyos.

Luego, tendrás que asignar en PHP las variables con los días: para esto podés usar mktime() o alguna otra función de manejo de fechas.

La obtencíón de las fechas se puede simplificar haciendo que $ultimo_dia_mes_anterior tenga el 1ro del mes siguiente y comparando con < en vez de con <=.

Saludos!

0voto

danielreales7 comentado

He intentado hacer la consulta con mis datos y no consigo que me devuelva nada.
Quiero obtener el número máximo de votos en realidad no, de la suma de dichos votos que se almacenan en un campo de la BD, en vez de hacer un COUNT sería MAX? y no he conseguido obtener el primer día del més anterior ni el último, porque he visto varias funciones por ahí que funcionan con DATEDIFF pero no sé exactamente como funciona, gracias por el aporte!

0voto

Leonardo-Tadei comentado

Poné la estructura de la tabla para ver cómo tenés diseñado el almacenamiento... hay quienes cuentan un voto sumando 1 al valor en un campo, y hay quienes almacenan un registro por cada voto (que es lo que dice la Normalización)

Respecto a la fecha del mes anterior al actual, yo te proponía calcularlo desde PHP. También se puede calcular directamante en la query como explica @carlossevi acá http://entredesarrolladores.com/4751/como-puedo-hacer-que-solo-me-aparezcan-los-datos-de-el-mes?show=4753#a4753

Pero como te decía, depende e la estructura de tus datos.

0voto

danielreales7 comentado

La tabla contiene un campo id, id_user(el usuario que participa), votos(va sumando +1 cada vez que votan), suma(va sumando según la puntuación de votos que le den), fecha(donde está la fecha del registro del usuario al concurso)

0voto

Leonardo-Tadei comentado

Hola Daniel,

si en el campo votos estás sumando la cantidad de votos recibidos por el usuario, la query podría ser así:

SELECT id_user, MAX(votos)
FROM Tabla
WHERE YEAR(fecha) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH)
AND MONTH(fecha) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH)
ORDER BY MAX(votos) DESC

Si en cambio es para saber los votos recibidos, sería lo mismo pero para el campo suma.

Igual me queda una duda: con este almacenamiento, sabés los votos del usuario inscripto en el último mes, pero no los votos recibidos durante el último més, que es lo que entendí al principio que querías hacer.

Saludos!

0voto

danielreales7 comentado

Claro, yo tengo una parecida y me devuelve solo el del mes pasado el que mayor puntuación a tenido, pero quiero también todos los demás meses hasta el último mes que exista en el campo fecha.
Mi query es esta:

SELECT * FROM `tbl_concurso_participantes` WHERE MONTH(`mes`) = MONTH(CURDATE()) AND YEAR(`mes`) = YEAR(CURDATE()) GROUP BY `sexo` ORDER BY `suma` DESC

0voto

Leonardo-Tadei comentado

Daniel,

lo que planteás no es complicado, pero no entiendo el sentido semántico de la consulta.

Decís que el campo fecha es cuando se registró el usuario al concurso, entonces un usuario del mes pasado que viene sacando 10 votos por mes, tendrá menor puntuación que uno que ingresó hace 10 meses y tiene 3 votos por mes.

Qué sentido tiene comparar el puntaje de usuarios que no están concursando desde fechas cercanas entre ellos?

Ando un poco desorientado desde el principio, porque el título habla del "último año" pero comenzás diciendo que querés "el usuario que mayor número de votos tenga y a su vez sea del mes anterior al que estamos"... de esto último entiendo que tiene que ser un usuario registrado al concurso en el último mes, con lo que nunca tendrá votos anteriores a su registro.

Otra cosa confusa es que pedís "mayor cantidad de votos", pero también hay una suma con la puntuación, y no es lo mismo mayor cantidad de votos que mayor puntaje acumulado.

Me parece que estoy necesitando de tu paciencia, de la estructura de las tablas involucradas y de una breve explicación sin contradicciones...

Saludos cordiales!

0voto

danielreales7 comentado

Ya lo logré hacer Leonardo, lo siento por contestar tarde, ando liado.
Mi objetivo es, tengo una tabla de concurso en el que el usuario puede participar 1 vez por mes, de ahí tengo los votos que le hacen al usuario y la suma de la puntuación por cada voto, más la fecha en que se registró en el concurso.

Funciona por mes, es decir, al finalizar el mes, se elimina automáticamente dichos participantes y pueden volver a participar.

Lo que yo quería era obtener la mayor puntuación (Suma), de todos los usuarios que existen en la BD de cada mes anterior al actual. Lo que dije de que se eliminan dichos usuarios, no se eliminan de la BD sino que al mostrar los usuarios, sólo aparecen los del mes actual.

Te dejo la consulta:

SELECT `id`,`id_user`,max(`suma`) as maxima,`sexo`, month(`mes`) as mes,year(`mes`) as anio FROM `tbl_concurso_participantes` GROUP BY `sexo`,month(`mes`) ORDER BY year(`mes`) DESC, month(`mes`) DESC

0voto

Leonardo-Tadei comentado

Gracias por el contexto de uso de los datos!

Tengo una duda: la query que ponés no te devuelve los votos del mes actual en vez de devolverte los del mes anterior???

Igual, si no entiendo mal esta última explicación, no hay datos del mes anterior porque swe borran al iniciar el nuevo mes, entonces la consulta es imposible hacerla sobre el mes anterior, que es lo que preguntabas al principio.

En fin: me alegro de veras que lo haqyas solucionado, pero tu descripción del problema me resultó desde el principio muy confusa :-(

Saludos cordiales!

0voto

danielreales7 comentado

Me devuelve un usuario o dos por cada mes(Hombre y mujer si los hay) que mayor suma de votos tenga en los meses anteriores, es decir, puede haber un hombre y una mujer, pero no 2 hombres ni 2 mujeres.

Puede que te haya liado yo al explicarme mal, y muchas gracias por todo!

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