SQL:以滚动的每小时投票数限制计算唯一投票

时间:2008-09-16 11:34:43

标签: sql voting

给出一张投票表(用户投票选择,并且必须提供电子邮件地址):

votes
--
id: int
choice: int
timestamp: timestamp
ip: varchar
email: varchar

计算“独特”投票的最佳方法是什么(用户是电子邮件+广告投放组合的独特组合),因为他们每小时只能投票两次

可以计算第一次和最后一次投票之间的小时数,并确定该时间段允许的最大投票数,但这样可以让用户将所有投票压缩到一个小时长的窗口,并且仍然有他们算了。

我意识到匿名在线投票本质上存在缺陷,但我不确定如何使用SQL进行此操作。我应该使用外部脚本还是其他什么? (对于每个选项,对于每个电子邮件+ IP对,进行投票,计算下一个+ 1h时间戳,计算/丢弃/计票,继续下一个小时等等)。

3 个答案:

答案 0 :(得分:3)

这样的东西
select email, ip, count(choice)
from votes
group by email, ip, datepart(hour, timestamp)

如果我理解正确

答案 1 :(得分:0)

您可以重写您的插入语句,只允许根据您的禁区插入投票:

Insert Into Votes
(Choice, Timestamp, IP, Email)
Select
Top 1
@Choice, @Timestamp, @IP, @Email
From
Votes
Where
(Select Count(*) From Votes Where
    IP = @IP
    and Email = @Email
    and Timestamp > DateAdd(h, -2, GetDate())) < 3

您没有提到您使用的是哪种SQL语言,因此这是在SQL Server 2005中。

答案 2 :(得分:0)

我认为这样做会:

SELECT choice, count(*) 
FROM votes v 
WHERE 
  ( SELECT count(*) 
    FROM   votes v2
    WHERE  v.email = v2.email 
    AND    v.ip    = v2.ip 
    AND    v2.timestamp BETWEEN dateadd(hour, -1, v.timestamp) AND v.timestamp 
  ) < 2 

仅供参考,为了计算用户每小时只能投票一次的投票,我们可以这样做:

SELECT choice, count(*) 
FROM votes v 
WHERE NOT EXTISTS 
  ( SELECT * 
    FROM   votes v2
    WHERE  v.email = v2.email 
    AND    v.ip    = v2.ip 
    AND    v2.timestamp BETWEEN dateadd(h,v.timestamp,-1) AND v.timestamp 
  )