1

我有 3 个包含以下列的表:

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

每人user可以为每人投票一次creation。当用户投票时,会发生这种情况:

  • Table : 用andvotes插入一个新行(这样我们可以检查用户是否已经投票支持这个创建)user_idcreation_id
  • creations:将 +1 添加到creation_points相关创建的行

但是现在,我希望当用户成功为一个创作投票时,它会向他显示他还没有投票的下一个创作。我怎样才能做到这一点?

我试过这样:

  1. creation_idcreations表中选择下一个(其中creation_id大于当前的creation_id
  2. 检查这对夫妇creation_id&是否user_id已经存在于votes表中。如果存在,请从 1) 重试。

这种方法的问题是,如果用户已经投票支持下一个创建,它需要大量查询。如果他已经为所有创作投票,它也会创建一个无限循环。还有其他选择吗?

4

2 回答 2

2

如果我了解您是如何处理它的,那么通过将and存储votes为您似乎走上了正确的轨道。要获得下一个可用的创作,请使用排除已投票创作的查询:user_idcreation_idLIMIT 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
于 2012-03-31T22:32:41.350 回答
0

你可以加入投票表

如果您当前的 creation_id = 123456

您的用户 ID = 789

SELECT c.creation_id 
FROM creations AS c 
INNER JOIN votes AS v ON v.creation_id = c.creations_id 
WHERE c.creation_id > 123456 AND v.user_id != 789 
ORDER BY c.creation_id ASC 
LIMIT 0,1
于 2012-03-31T22:39:21.683 回答