2012-03-17 1 views
0

나는 사용자를 1 표로 제한하려는 투표 프로그램을 설정 중입니다. 저는 두 개의 테이블을 가지고 있습니다 : (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; 

하더라도 존 중복 투표는 UP = 1로 인해 투표 테이블에서 항상 1이됩니다. 그러나 Subject_Table에서는 그렇지 않습니다. 제약이 없으면 John은 무한히 투표 할 수 있습니다. 제약 조건은 주체 - 사용자 쌍이어야합니다. John은 다른 주제에 투표 할 수 있고 다른 사용자는 Cows에 투표 할 수 있기 때문에 제약 조건은 제목이나 사용자 일 수 없습니다.

Subject_Table을 업데이트하기 전에 Vote_Table을 확인하여 고유 한 Subject-User 쌍 (Cows 및 John)이 있는지 어떻게 확인할 수 있습니까?

답변

1

당신은 WHERE 절에 통합 할 수 있습니다 : 당신이 정말 Subject_Table을 전혀 필요 모르겠어요 말했다

UPDATE Subject_Table 
    SET Total_Votes = Total_Votes + 1 
WHERE Subject = ... 
    AND NOT EXISTS 
     (SELECT 1 
      FROM Vote_Table 
      WHERE Subject = ... 
      AND User = ... 
     ) 
; 

; 별도의 테이블을 만들지 않고 똑같은 정보를 줄 수있는 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

고마워요. 이것은 완벽하게 작동했습니다. 전에는 다른 형식으로 존재하지 않는 곳을 시도해 보았고 작동시키지 못했습니다. 구문에 관한 모든 것입니다. 뷰 제안에 관해서는 뷰를 만들지 만 테이블은 여기서 제시 한 것보다 훨씬 복잡합니다. 생각 나는 제안에 감사드립니다! – tjones

+0

@tjones : 천만에! – ruakh

관련 문제