GQL - 选择所有父母特定孩子不在儿童中

问题描述:

我想要一个父级班(Group),其中任何数量的用户都可以加入。我想显示用户尚不在的所有组。我如何对这些数据建模,以及如何查询?对不起,没有提供任何代码,但我根本不知道。GQL - 选择所有父母特定孩子不在儿童中

编辑: 在SQL中,这将通过用户表,组表和GroupUser交叉表完成。和查询会去:

select * 
from Group 
where Group.ID not in 
(
select GroupID 
from GroupUser 
where UserID = @userid 
) 
+0

GQL不能做到这一点。 (这也不是亲子关系,但这只是您的术语问题,并不影响实际功能。) – geoffspear 2012-01-13 20:57:28

+0

那么请尝试超越术语并提出解决方案。这种关系在现实中很常见。 – Landrew 2012-01-13 21:06:11

+0

你期望有多少组?您可以为每个用户存储一个组列表,并将其与所有组的列表进行比较,但这并不能很好地扩展。 – geoffspear 2012-01-13 21:07:45

也许我不明确地提出我的问题,我显然是GAE的新手,我的术语可能是错误的。反正这里是我的解决方案:

class User(db.Model): 
    username = db.StringProperty() 

class Group(db.Model): 
    users = db.ListProperty(db.Key) 

要查找一组,并加入(有些简化):

groups = db.GqlQuery("SELECT * " 
        "FROM Group")   

for g in groups:     
    if user.key() not in g.users:      
     group = g 
     break 

group.users.append(user.key()) 

将会有成千上万的组和用户将成为他们的几十个成员?

您将遇到用户体验问题:您如何让用户从数千个组中选择?有50多页的分页表?

关于你的问题:当你解决以上问题,那么你可以正确标记组的用户已经是一个成员:

你可以简单的在内存中的所有用户群体(这是只有十的ID,对不对? ),并在显示组时简单地过滤它们。

+0

Knego,谢谢。没关系用户体验。 Group/User示例只是一个示例。实际上,后端会自动将用户分配到他们不是成员的“组”。你能用一些代码示例来开发你的建议解决方案吗? – Landrew 2012-01-14 08:58:42

+0

随机挑选组,如果用户还不是会员(组员为1:1000的机会很小),请将他添加到组中。如果是会员,请重复。 – 2012-01-14 09:34:32

正如Wooble所说,没有办法为App Engine数据存储构建像这样的查询。如果你的组数大大超过了用户实际所在的组数,你最好的选择就是选择所有的组,然后过滤出用户已经在的组 - 这正是SQL数据库给出的查询的功能。