我正在设立一个投票计划,我想限制用户一票。我有两个表:(a)主题表和(b)投票表。
**Subject_Table**
SID Subject Total_Votes
1 Cows 5
2 Chickens 3
**Vote_Table**
VID Subject User Voteup
1 Cows John 1
总票数等于所有用户的投票。如果主题被投票,Voteup只能等于1。我使用以下语句与Subject和User建立了一个唯一的值对,没有任何问题:
ALTER TABLE Vote_Table ADD UNIQUE limitvote(Subject,User);
首次投票时,会执行以下查询:
$sql="INSERT INTO Vote_Table (Subject, User,Voteup) VALUES ('$Subject', '$User', '$Voteup') ON DUPLICATE KEY UPDATE up=1";
$q = "UPDATE Subject_Table SET Total_Votes = $votes_up= //current votes plus 1;
即使John投票两次,由于ON DUPLICATE KEY UPDATE up = 1,投票在Vote_Table中总是等于1。但在Subject_Table中并非如此。没有约束,约翰可以无限投票。约束必须是主题 - 用户对。约束不能只是主题或用户,因为约翰可以投票给其他主题,其他用户可以投票给奶牛。
在更新Subject_Table之前,如何检查Vote_Table以查看唯一的主题 - 用户对(Cows和John)是否存在?
答案 0 :(得分:1)
您可以将其合并到WHERE
子句中:
UPDATE Subject_Table
SET Total_Votes = Total_Votes + 1
WHERE Subject = ...
AND NOT EXISTS
( SELECT 1
FROM Vote_Table
WHERE Subject = ...
AND User = ...
)
;
那就是说,我不确定你真的需要Subject_Table
;您可以在Vote_Table
上创建一个视图,该视图将为您提供相同的信息,而无需创建单独的表。 (参见the Wikipedia article on Database normalization。)看起来像这样:
CREATE VIEW Subject_View AS
SELECT Subject,
COUNT(1) AS Total_Votes
FROM Vote_Table
GROUP
BY Subject
;