首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Google-App-Engine中的联合排序

Google-App-Engine中的联合排序
EN

Stack Overflow用户
提问于 2009-10-18 16:21:55
回答 1查看 321关注 0票数 0

我有一门课:

代码语言:javascript
复制
class Transaction(db.Model):
    accountDebit = db.ReferenceProperty(reference_class=Account,
                                       collection_name="kontoDuguje")
    accountCredit = db.ReferenceProperty(reference_class=Account, 
                                       collection_name="kontoPotrazuje")
    amount = db.FloatProperty()
    Tran_date = db.DateProperty()
    comment = db.StringProperty()

下面是Account类的方法,我希望通过它获得特定帐户的所有事务(使用accountDebit或accountCredit进行的事务),但按日期排序:

代码语言:javascript
复制
def GetTransactions(self):
    transactions = []
    transactions_debit = db.GqlQuery('SELECT * FROM Transaction ' + 
                                    'WHERE accountDebit=:1',self)
    transactions_credit = db.GqlQuery('SELECT * FROM Transaction ' + 
                                    'WHERE accountCredit=:1',self)
    for x in transactions_debit:
        x.amount = -x.amount
        transactions.append(x)
    for x in transactions_credit:
        x.amount = x.amount
        transactions.append(x)
   return transactions

目的是将这两种结果结合起来,但要有限制+偏移量。考虑到在单个查询中不能提取超过1000行的事实...

请帮帮忙

EN

回答 1

Stack Overflow用户

发布于 2009-10-19 00:20:45

您可以执行OR (Python在应用程序级别费力地为您合成它),它负责“与排序的并集”。但是,如果您需要担心> 1000个事务,这将没有帮助(也不会有offset和limit: offset + limit的总和限制为1000!)。您将需要对某些内容进行切片(假设与排序所依据的字段相同,我猜是tran_date?)有几个<条件,当然不能保证你想要的确切的限制和偏移量,所以你必须稍微超出它们,并在应用程序级别上切掉进程。

编辑:OR实际上不是在应用程序级别合成的(IN和!=是两个操作),所以你需要自己合成它(当然也是在应用程序级别),例如:

代码语言:javascript
复制
def GetTransactions(account):
    transactions = list(db.GqlQuery(
        'SELECT * FROM Transaction WHERE '
        'accountDebit = :1 ORDER BY Tran_date', account))
    transactions.extend(db.GqlQuery(
        'SELECT * FROM Transaction WHERE '
        'accountCredit = :1 ORDER BY Tran_date', account))
    transactions.sort(key=operator.attrgetter('Tran_date'))
    return transactions

但最大的问题仍然是上面概述的那些。

如果不知道这些数字的数量级,很难提出具体的设计选择!-)

编辑:对于这些参数中的任何数量级,都没有最优的,甚至是合理的解决方案--您如何有效地处理每个用户每天数百万的事务将与您处理每个用户每天几个事务的方式截然不同;我甚至无法想象在这两种情况下都有意义的体系结构(我可能,也许是在关系上下文中,但不是在像我们这里这样的非关系上下文中--例如,为了适当地处理每天数百万个事务的情况,您确实希望在事务上有一个更细粒度的时间戳,而不仅仅是记录它的日期!)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1585299

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档