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声明,所以不幸的是,不可能完全按照您的意愿行事。

如果 userIds 的总集很小,您可以反转查询以使用该IN语句。例如:

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

请注意,这是为IN语句中的每个值执行一个子查询,并且每个 GQL 语句最多允许 30 个查询。

如果答案的总集合userId = 1很小,您可以选择所有答案并从userId = 1您自己的代码中过滤掉答案。但是,如果来自 userId 1 的 Answers 集很大,这将不是特别有效。

最后,您可以使用 cron 预先计算结果(并将它们存储到数据存储和/或内存缓存中),而不是按需计算这些查询中的任何一个。当您的代码需要这些查询之一的结果时,您可以加载缓存的结果。

于 2012-05-07T03:18:39.527 回答