[英]MySQL: How do I return only unique entries from one table that don't exist in another based on different columns?
[英]MYSQL How do I update a table only if a unique key pair of two columns does not exist in another table?
我正在设置一个投票程序,希望限制用户只能投票一次。 我有两个表:(a)主题表和(b)投票表。
**Subject_Table**
SID Subject Total_Votes
1 Cows 5
2 Chickens 3
**Vote_Table**
VID Subject User Voteup
1 Cows John 1
总票数等于所有用户的票数。 如果对某个主题进行投票,则投票只能等于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以查看是否存在唯一的Subject-User对(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
上创建一个视图,该视图将为您提供相同的信息,而无需创建单独的表。 (请参阅有关数据库规范化的Wikipedia文章 。)如下所示:
CREATE VIEW Subject_View AS
SELECT Subject,
COUNT(1) AS Total_Votes
FROM Vote_Table
GROUP
BY Subject
;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.