给出一张投票表(用户投票选择,并且必须提供电子邮件地址):
votes
--
id: int
choice: int
timestamp: timestamp
ip: varchar
email: varchar
计算“独特”投票的最佳方法是什么(用户是电子邮件+广告投放组合的独特组合),因为他们每小时只能投票两次?
可以计算第一次和最后一次投票之间的小时数,并确定该时间段允许的最大投票数,但这样可以让用户将所有投票压缩到一个小时长的窗口,并且仍然有他们算了。
我意识到匿名在线投票本质上存在缺陷,但我不确定如何使用SQL进行此操作。我应该使用外部脚本还是其他什么? (对于每个选项,对于每个电子邮件+ IP对,进行投票,计算下一个+ 1h时间戳,计算/丢弃/计票,继续下一个小时等等)。
答案 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
)