2012-03-31 22 views
1

私は、次の列を持つ3つのテーブルを持っているユーザーが投票しなかったため、次の項目を選択する方法:評価システム:まだ

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

userは、各creationに対して1回投票することができます。ユーザーの投票は、これが発生した場合:

  • votesは:user_idcreation_idに新しい行を挿入し
  • creations(ので、我々は、ユーザーがすでにこの創造のために投票したかどうかを確認することができます):に1を追加します。今、私は、ユーザーが正常に作成するために投票したとき、それは彼に彼がまだ投票しなかったため作成が表示されることを懸念作成

の行creation_pointsしかしたい。それをどうすれば実現できますか?

  1. カップルcreation_id & user_idはすでにvotesテーブルに存在する場合
  2. チェック(creation_idが現在creation_idよりも大きい)creationsテーブルから次のcreation_idを選択:

    私はこの方法を試してみました。存在する場合は、1)から再試行してください。

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

答えて

2

あなたがそれをどのように扱っているか理解していれば、votesuser_idcreation_idと保存して正しい軌道にいるようです。

このメソッドは、NOT IN()サブクエリを使用しています:代わりにNOT EXISTSを使用して

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 

同様の事:

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 
0
次の使用可能な作成を取得するには、すでに投票-のための作品を除外 LIMIT 1クエリを使用

投票テーブルに参加することができます

現在の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