2

私は持っています

class Question(db.Model):
    wording = db.StringProperty(required=True)

class Answer(db.Model):
    question = db.ReferenceProperty(Question, required=True)
    userId = db.IntegerProperty(required=True)

そして私はしたい

SELECT * FROM Question WHERE Id NOT IN (
       SELECT QuestionId FROM Answer WHERE userId = 1)

GQLでそれを行う方法

4

1 に答える 1

4

GQLにはNOT INステートメントがないため、残念ながら、希望どおりの処理を実行することはできません。

userIdの合計セットが小さい場合は、クエリを逆にしてINステートメントを使用できます。例えば:

SELECT * FROM Answer WHERE userId IN ('2', '3')

これはINステートメントの値ごとにサブクエリを実行しており、GQLステートメントごとに最大30のクエリが許可されていることに注意してください。

回答の総数が少ない場合は、すべての回答を選択して、独自のコードuserId = 1から回答を除外できます。userId = 1ただし、userId 1からの回答のセットが大きい場合、これは特に効率的ではありません。

最後に、これらのクエリのいずれかをオンデマンドで計算するのではなく、cronを使用して結果を事前計算することができます(データストアやmemcacheに保存します)。コードでこれらのクエリのいずれかの結果が必要な場合は、キャッシュされた結果を読み込むことができます。

于 2012-05-07T03:18:39.527 に答える