3

投票の表が与えられた場合 (ユーザーは選択肢に投票し、電子メール アドレスを提供する必要があります):

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

1時間に2回しか投票できないという制約を考慮して、「一意の」投票(ユーザーは電子メールとIPの一意の組み合わせ)をカウントする最良の方法は何ですか?

最初の投票と最後の投票の間の時間数を数えて、その時間枠で許可される最大投票数を決定することは可能ですが、これにより、ユーザーはすべての投票を、たとえば 1 時間のウィンドウに圧縮しても、それらをカウントしたままにすることができます。

匿名のオンライン投票には本質的に欠陥があることは認識していますが、SQL でこれを行う方法がわかりません。代わりに外部スクリプトなどを使用する必要がありますか? (選択肢ごと、電子メールと IP のペアごとに、投票を取得し、次の +1h タイムスタンプを計算し、投票をカウント/破棄/集計し、次の時間に進むなど...)

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 

参考までに、ユーザーが 1 時間に 1 回しか投票できない投票をカウントするには、次のようにします。

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 ステートメントを書き直すことができます。

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 に答える