投票脚本,简化数据库查询的可能性

时间:2010-05-28 23:47:14

标签: php mysql database-design

我有一个投票脚本,它将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=?

在网页上显示新的投票数

有更好的方法吗? 3个查询严重降低了用户的投票体验

修改

  • 在投票表中,vote_id是主键
  • 在post表中,post_id是主键。
  • 有什么其他建议可以加快速度吗?

2 个答案:

答案 0 :(得分:6)

您可以合并前两个查询:

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

你仍然需要运行第三个。

确保PRIMARY KEYvotes_table (user_id, post_id)上有唯一索引或post (post_id)

最有可能的是,您当前的查询速度缓慢是由于缺少这些索引引起的。

答案 1 :(得分:1)

Quassnoi的回答是非常低效的,因为将用户投票的每个post_id拉入NOT IN。

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。