2011-06-02 5 views
5

que tienen que crear una consulta de MySQL para obtener una distribución de votos de cada día superior a una fecha determinada, algo como esto ...consulta mysql: cómo obtener el número de sí/no califican por día

date   yes_votes no_votes 
------------------------------------------ 
    2010-01-07 21   22 
    2010-01-07 2   0 

Mi mesa es así ..

post_votes 
-------------------------- 
    id(longint) 
    date(timestamp) 
    flag(tinyint) // this stores the yes/no votes 1-yes, 2-no 

estoy atascado en este ....

SELECT COUNT(*) AS count, DATE(date) FROM post_votes WHERE date > '2010-07-01' GROUP BY DATE(date) 

esto da el número total de votos por día, pero no la distribución que quiero.

+0

¿Puede dejarlo más claro? Dudo que entiendo tu pregunta. –

+0

La segunda fila de la tabla de resultados deseada debe ser '2010-02-07, 2, 0', ¿verdad? –

+0

@ypercude - ¡Sí! ese tonto copy-paste otra vez :) – vikmalhotra

Respuesta

10
SELECT COUNT(*) AS count 
    , DATE(date) 
    , SUM(flag = 1) AS yes_votes 
    , SUM(flag = 2) AS no_votes 
FROM post_votes 
WHERE date > '2010-07-01' 
GROUP BY DATE(date) 

Este es un truco que funciona en MySQL, como flag=1, o bien ser True o False. Pero True = 1 y False = 0 en MySQL para que pueda agregar los 1s y 0s usando la función SUM().

Otras soluciones con IF o sería mejor para mayor claridad o si hay alguna posibilidad de que desee mover la base de datos a otro RDBMS.

Los comentarios no relacionados con la pregunta:

  • Es mala costumbre de utilizar palabras reservadas como date o count para dar nombre a los campos o tablas.
  • Tampoco es bueno usar "fecha" cuando realmente almacena una marca de tiempo. Los nombres deben reflejar el uso.
  • Para nombres de tabla, se recomienda usar singular (post_vote) y no plural, aunque muchos usan plural, al final resulta confuso. Plural es bueno para algunos campos o campos calificados, como su yes_votes y no_votes donde tenemos un recuento.
+0

+1 Gracias por los consejos adicionales. – vikmalhotra

4

que está casi en la solución :)

yo recomendaría el uso de una condición IF en un método SUM así:

SELECT SUM(IF(flag = 'yes',1,0)) AS yes_count, 
     SUM(IF(flag = 'no',1,0)) AS no_count, 
     DATE(date) 
FROM post_votes 
WHERE date > '2010-07-01' 
GROUP BY DATE(date) 

Esto permitirá que la función de añadir 1 para cada suma sólo si el valor es igual a yes/no

+0

+1 Oh, claro. eso funciona perfectamente Gracias. – vikmalhotra

4
SELECT DATE(date) as dt, 
sum(if(flag=1,1,0)) as yes, 
sum(if(flag=2,1,0)) as no 
FROM post_votes WHERE date > '2010-07-01' 
GROUP BY dt 
5

Sumalo:

select date(date) as date, 
     sum(case when flag = 1 then 1 else 0) as yes, 
     sum(case when flag = 2 then 1 else 0) as no 
from post_votes 
where date > '2010-07-01' 
group by date(date) 
0

Tuve ese problema también. La mejor solución de que se me ocurre, es dividir la "bandera" en dos campos, como:

upvote(tinyint) 
downvote(tinyint) 

, entonces son capaces de contarlas muy fácil y sin mysql-vudú:

SELECT 
    SUM(upvote) AS up, 
    SUM(downvote) AS down, 
    DATE(`date`) AS Created_at 
FROM post_votes 
WHERE Created_at > '2010-07-01' 
GROUP BY Created_at 

Btw .: No debe nombrar una columna date, porque es una palabra clave MySQL.

Cuestiones relacionadas