2010-05-28 3 views
3

post_id 및 user_id를 테이블에 저장하는 투표 스크립트를 사용하여 특정 사용자가 이미 게시물에 투표했는지 여부를 확인하고 나중에이를 거부 할 수 있습니다.투표 스크립트, 데이터베이스 쿼리 간소화 가능성

이렇게하려면 다음 3 가지 쿼리를 수행하고 있습니다.

SELECT user_id, post_id from votes_table where postid=? AND user_id=? 

그 후, 어떤 행을 반환하지 않는 경우 :

UPDATE post_table set votecount = votecount-1 where post_id = ? 

그런 다음

SELECT votecount from post where post_id=? 

는이 작업을 수행하는 더 나은 방법을 웹 페이지

에 새로운 votecount을 표시하려면? 3 개 쿼리가 심각 투표 테이블에서 사용자의 투표 경험

편집

  • 둔화되어, vote_id는 포스트 테이블에서 기본 키
  • 입니다 post_id를 기본 키입니다.
  • 다른 모든 제안을 빠르게 처리 할 수 ​​있습니까?
+0

왜 투표 수에서 1을 뺍니까? Vote_table에 레코드처럼 이미 뭔가를 추가했기 때문에? –

+0

게시물이 다운 투표 된 경우 투표 수에서 1을 뺍니다. 더 나은 제안이 있으십니까? – Sev

+0

필자의 대답에서 언급했듯이 post_table.vote_count를 유지하지 마십시오. 카운트가 필요할 때 votes_table에서 플러스/마이너스 투표를 합산하십시오. –

답변

6

당신은 처음 두 쿼리를 병합 할 수 있습니다 :

UPDATE post 
SET  votecount = votecount - 1 
WHERE post_id = ? 
     AND post_id NOT IN 
     (
     SELECT post_id 
     FROM votes_table 
     WHERE user_id = ? 
     ) 

는 여전히 세 번째를 실행해야합니다.

votes_table (user_id, post_id)post (post_id)에 고유 색인 또는 PRIMARY KEY이 있는지 확인하십시오.

아마도 현재 쿼리 속도가 느려지는 것은 이러한 인덱스가 없기 때문일 수 있습니다.

+0

투표 _ 표에 vote_id가 있습니다. 그것을 기본 키로 만들 수 있습니까? votes_table에 – Sev

+0

이 있으면 vote_id는 이미 기본 키입니다. 게시 테이블에서 post_id는 기본 키이기도합니다. 내가 놓친 게 있니? – Sev

+2

@Sev :'유일한 색인 생성하기 votes_user_post ON votes_table (user_id, post_id)' –

1

사용자가 NOT IN에 투표 한 모든 post_id를 가져 오는 덕분에 Quassnoi의 대답은 비효율적입니다.

UPDATE 
    dbo.Post 
SET 
    VoteCount = VoteCount + 1 -- Must be +1 right? Not minus 1? 
FROM 
    dbo.Post p 
WHERE 
    NOT EXISTS 
     (
     SELECT 
      v.PostID 
     FROM 
      dbo.Votes_Table v 
     WHERE 
      v.PostID = p.PostID 
     AND v.User_ID = ? 
     ) 
WHERE 
    p.PostID = ? 

IF(@@ROWCOUNT = 1) 
    PRINT 'No previous vote, votes incremented' 
ELSE 
    PRINT 'User has already voted, votes not incremented' 

개인적으로, 나는 심각 포스트 테이블에 vote_count을 유지 재고 것입니다.

+0

마이너스 1은 내가 하향 투표 스크립트를 언급했기 때문입니다. 그래도 같은 개념. – Sev

+0

또한, 내 DB가 MySQL이 아닌 MSSQL이라고 지정 했어야합니다. – Sev

+0

@Mark : 왜 비효율적이라고 생각합니까? – Quassnoi