我有3个表,列如下:
* users : user_id
* votes : user_id, creation_id
* creations : creation_id, creation_points
每个
user
可以为每个creation
投票一次。当用户投票时,会发生以下情况:Table
votes
:插入带有user_id
和creation_id
的新行(这样我们就可以检查用户是否已经投票支持这个创建)Table
creations
:将+1添加到有关创建的行creation_points
但是现在,我希望当用户成功地投票给一个创建时,它会显示他还没有投票的下一个创建。我怎样才能做到?
我试着这样做:
从
creation_id
表中选择下一个creations
(其中creation_id
大于当前creation_id
)检查在
creation_id
表中是否存在夫妻user_id
和votes
。如果存在,请重试1)。这个方法的问题是,如果用户已经投票支持下一个创建,那么它需要很多查询。如果他已经投票给所有的创造物,它也创造了一个无限循环。还有别的选择吗?
最佳答案
如果我理解您是如何处理它的,那么您将votes
存储为user_id
和creation_id
似乎是在正确的轨道上。要获取下一个可用的创建,请使用一个排除已投票的创建的LIMIT 1
查询:
此方法使用NOT IN()
子查询:
SELECT
creations.*
FROM creations
WHERE creation_id NOT IN (
SELECT creation_id FROM votes WHERE user_id = <the user_id>
)
ORDER BY creation_id ASC
LIMIT 1
使用
NOT EXISTS
来代替:SELECT
creations.*
FROM creations
WHERE NOT EXISTS (
SELECT creation_id
FROM votes
WHERE
user_id = <the user_id>
AND creations.creation_id = votes.creation_id
)
ORDER BY creation_id ASC
LIMIT 1
关于mysql - 评分系统:如何选择用户尚未投票的下一项,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9960251/