MYSQL仅当另一个表中不存在两列的唯一密钥对时,如何更新表?
我正在建立一个投票程序,我想限制用户最多投一票。我有两张表:(a)主题表和(b)投票表MYSQL仅当另一个表中不存在两列的唯一密钥对时,如何更新表?,mysql,insert,Mysql,Insert,我正在建立一个投票程序,我想限制用户最多投一票。我有两张表:(a)主题表和(b)投票表 **Subject_Table** SID Subject Total_Votes 1 Cows 5 2 Chickens 3 **Vote_Table** VID Subject User Voteup 1 Cows John 1
**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,投票表中的票数始终等于1。但在主题表中并非如此。没有限制,约翰可以无限投票。约束必须是主题-用户对。约束不能是唯一的主题或用户,因为John可以投票给其他主题,其他用户可以投票给奶牛
在我更新Subject_表之前,如何检查Vote_表以查看唯一的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 = ...
)
;
也就是说,我不确定您是否真的需要主题表
;您可以在投票表
上创建一个视图,该视图将为您提供相同的信息,而无需创建单独的表。(请参阅。)可能是这样的:
CREATE VIEW Subject_View AS
SELECT Subject,
COUNT(1) AS Total_Votes
FROM Vote_Table
GROUP
BY Subject
;
非常感谢!这很有效。我以前尝试过以不同形式存在的WHERE,但无法使其工作。这都是关于语法的。至于视图建议,我将创建一个视图,但是我的表比我在这里介绍的要复杂得多。不过,谢谢你的周到建议!