3

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

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

考虑到他们每小时只能投票两次的限制,计算“唯一”选票(用户是电子邮件 + ip 的唯一组合)的最佳方法是什么?

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

我意识到匿名在线投票本质上是有缺陷的,但我不确定如何使用 SQL 来做到这一点。我应该使用外部脚本还是其他什么?(对于每个选择,对于每个电子邮件 + ip 对,获得投票,计算下一个 +1 小时时间戳,计数/丢弃/计票,继续下一个小时,等等......)

4

3 回答 3

3

就像是

select email, ip, count(choice)
from votes
group by email, ip, datepart(hour, timestamp)

如果我理解正确

于 2008-09-16T11:37:54.307 回答
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 
  ) 
于 2008-09-16T16:31:31.667 回答
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 中。

于 2008-09-16T11:48:06.123 回答