作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在设置一个投票程序,我想限制用户只能投一票。我有两个表:(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。我已经使用以下语句与主题和用户建立了一个唯一的值对,没有任何问题:
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以查看唯一的Subject-用户对(Cows和John)是否存在?
最佳答案
您可以将其合并到 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
上创建一个 View ,该 View 将为您提供相同的信息,而无需创建单独的表。 (请参阅 the Wikipedia article on Database normalization 。)可能如下所示:
CREATE VIEW Subject_View AS
SELECT Subject,
COUNT(1) AS Total_Votes
FROM Vote_Table
GROUP
BY Subject
;
关于MYSQL 如何仅当另一个表中不存在两列的唯一键对时才更新表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9746582/
我是一名优秀的程序员,十分优秀!