2011-06-02 10 views
5

muszę utworzyć kwerendę mysql, aby uzyskać rozkład głosów każdego dnia przekraczającej określoną datę, coś takiego ...MySQL: Jak uzyskać liczbę tak/nie było głosów dziennie

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

Moja tabela jest tak ..

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

siedzę na to ....

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

daje łączną liczbę głosów na dzień, ale nie dystrybucję, której chcę.

+0

Czy możesz uczynić to bardziej zrozumiałym? Wątpię, czy rozumiem twoje pytanie. –

+0

Drugi wiersz w tabeli wyników wyszukiwania powinien mieć wartość "2010-02-07, 2, 0", prawda? –

+0

@ypercude - Tak! to głupie kopiuj-wklej ponownie :) – vikmalhotra

Odpowiedz

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) 

Jest to trik, który działa w MySQL, jak flag=1 będzie albo True lub False. Ale True = 1 i False = 0 w MySQL, dzięki czemu można dodać 1s i 0 za pomocą funkcji SUM().

Inne rozwiązania z IF lub CASE byłyby lepsze ze względu na przejrzystość lub istnieje możliwość przeniesienia bazy danych do innego systemu RDBMS.

Komentarze nie związane z pytaniem:

  • To zły nawyk używać zarezerwowanych słów jak date lub count nazywania pól lub tabel.
  • Niedopuszczalne jest także używanie "date", gdy faktycznie przechowujesz znacznik czasu. Nazwy powinny odzwierciedlać użycie.
  • W przypadku nazw tabel zalecane jest użycie liczby pojedynczej (post_vote), a nie w liczbie mnogiej - chociaż wiele z nich używa liczby mnogiej, na końcu staje się mylące. Liczba mnoga jest odpowiednia dla niektórych pól lub pól zliczonych, takich jak Twoje yes_votes i no_votes, gdzie mamy liczenie.
+0

+1 Dzięki za dodatkowe wskazówki. – vikmalhotra

4

jesteś prawie w roztworze :)

polecam Zastosowanie warunku IF w metodzie SUM tak:

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) 

Pozwoli dla funkcji, aby dodać 1 do każdej sumy tylko wówczas, gdy wartość jest równa yes/no

+0

+1 O rację. to działa idealnie. Dzięki. – 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

Podsumuj:

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

Miałem ten problem. Najlepszym rozwiązaniem tego mogę myśleć, to podzielić „flagę” w dwóch dziedzinach, jak:

upvote(tinyint) 
downvote(tinyint) 

Wtedy jesteś w stanie ich policzyć bardzo łatwo i bez mysql-voodoo:

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 .: Nie powinieneś nazywać kolumny date, ponieważ jest to słowo kluczowe MySQL.

Powiązane problemy