2008-09-16 4 views
3

SQL : 압연 당 투표 수 제한으로 고유 투표 계산하기

"고유 한"표를 계산하는 가장 좋은 방법은 무엇입니까 (사용자는 전자 메일 + ip의 고유 한 조합입니다) 제약 조건 하에서 그들은 시간당 두 번만 투표 할 수 있습니까?

첫 번째 투표와 마지막 투표 사이의 시간 수를 계산하고 그 시간대에 허용 된 최대 투표 수를 결정할 수는 있지만 사용자가 모든 투표를 한 시간 정도의 길이의 창으로 압축 할 수 있습니다 그들을 세어 보게.

익명의 온라인 투표가 본질적으로 결함이 있다는 것을 알고 있지만 SQL을 사용하여이를 수행하는 방법을 잘 모릅니다. 대신 외부 스크립트를 사용해야합니까? (각 선택 사항, 각 이메일 + IP 쌍에 대해 투표를하고, 다음 + 1 시간 소인을 계산하고, 투표 수/폐기/집계표를 계산하고, 다음 시간으로 이동하는 등 ...)

답변

3

이와 비슷한 내용

만약 내가 제대로 이해하고
select email, ip, count(choice) 
from votes 
group by email, ip, datepart(hour, timestamp) 

에서만 투표가 당신의 contrainsts에 따라 삽입 할 수 있도록하여 삽입 문을 다시 작성할 수
+0

질문에 최대 투표 수는 2 시간이라고 할 수 있습니다. 따라서 count (choice)를 "if (count (choice)> 2,2, count (choice))로 변경하면 시간당 유효한 표를 얻을 수 있습니다. count (choice) - MySQL이 "IF"로 가정합니다. – ConroyP

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 언어 당신에게 언급하지 않았다 사용하고 그래서 이것은 2005

0

내가이 그것을 할 것이라고 생각 SQL 서버에 있습니다

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 
)