2012-03-17 56 views
0

我正在設置一個投票程序,我想限制用戶只能投一票。我有兩個表格:(a)主題表格和(b)投票表格。MYSQL只有在另一個表中不存在兩列的唯一密鑰對時,我該如何更新表?

**Subject_Table**    

SID Subject Total_Votes   
1  Cows  5  
2  Chickens 3  


**Vote_Table** 

VID Subject User Voteup   
1  Cows  John 1  

所有用戶的總票數相等。如果一個主題被投票,投票只能等於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; 

即使由於ON DUPLICATE KEY UPDATE up = 1,John在投票表中兩次投票總是等於1。但是在Subject_Table中並非如此。沒有約束,約翰可以無限投票。約束必須是主體 - 用戶對。約束條件不能僅限於主題或用戶,因爲約翰可以投票選擇其他主題,其他用戶可以投票給奶牛。

如何檢查Vote_Table,看看獨特的主題,用戶對(牛和John))存在之前,我更新Subject_Table?

回答

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 
; 
+0

非常感謝!這工作完美。我之前嘗試過以不同形式存在的WHERE NOT EXISTS,並且無法使用它。這完全是關於語法的。至於視圖建議,我會創建一個視圖,但是我的表比我在這裏介紹的要複雜得多。感謝您的深思熟慮的建議! – tjones 2012-03-17 02:40:40

+0

@tjones:不客氣! – ruakh 2012-03-17 02:50:01

相關問題