我有一个投票脚本,它将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个查询严重降低了用户的投票体验
修改
答案 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 KEY
和votes_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。