1

次の列を持つ3つのテーブルがあります。

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

それぞれがそれぞれuserに1回投票できますcreation。ユーザーが投票すると、これが発生します:

  • 表: andを使用votesして新しい行を挿入します(ユーザーがこの作成にすでに投票しているかどうかを確認できます)user_idcreation_id
  • 表:関連する作成のcreations行に+1を追加しますcreation_points

しかし今、ユーザーが作品に投票することに成功すると、まだ投票していない次の作品が表示されるようにしたいと思います。どうすればそれを達成できますか?

私はこのように試しました:

  1. creation_idテーブルから次を選択しcreationsます(creation_id現在よりも大きい場合creation_id
  2. カップルcreation_iduser_idがすでにvotesテーブルに存在するかどうかを確認します。存在する場合は、1)から再試行してください。

この方法の問題は、ユーザーが次の作成にすでに投票している場合、多くのクエリが必要になることです。また、彼がすでにすべての作品に投票している場合は、無限ループを作成します。他に選択肢はありますか?

4

2 に答える 2

2

あなたがそれをどのように扱っているかを私が理解しているなら、あなたはと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
于 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 に答える