我有3个表,列如下:

* users : user_id
* votes : user_id, creation_id
* creations : creation_id, creation_points

每个user可以为每个creation投票一次。当用户投票时,会发生以下情况:
Tablevotes:插入带有user_idcreation_id的新行(这样我们就可以检查用户是否已经投票支持这个创建)
Tablecreations:将+1添加到有关创建的行creation_points
但是现在,我希望当用户成功地投票给一个创建时,它会显示他还没有投票的下一个创建。我怎样才能做到?
我试着这样做:
creation_id表中选择下一个creations(其中creation_id大于当前creation_id
检查在creation_id表中是否存在夫妻user_idvotes。如果存在,请重试1)。
这个方法的问题是,如果用户已经投票支持下一个创建,那么它需要很多查询。如果他已经投票给所有的创造物,它也创造了一个无限循环。还有别的选择吗?

最佳答案

如果我理解您是如何处理它的,那么您将votes存储为user_idcreation_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/

10-11 22:34
查看更多