3

我有一个sql查询如下

select cloumn1,column2,count(column1) as c 
from Table1 where user_id='xxxxx' and timestamp > xxxxxx
group by cloumn1,column2
order by  c desc limit 1;

我成功编写了 sqlalchemy 等价物

result = session.query(Table1.field1,Table1.field2,func.count(Table1.field1)).filter(
    Table1.user_id == self.user_id).filter(Table1.timestamp > self.from_ts).group_by(
    Table1.field1,Travelog.field2).order_by(desc(func.count(Table1.field1))).first()

但我想避免func.count(Table1.field1)order_by子句中使用。

如何在 sqlalchemy 中使用别名?任何人都可以举出任何例子吗?

4

2 回答 2

6

别名用于表格;查询中的列被赋予一个标签。这也时不时让我绊倒。

你可以通过这两种方式。func.count()首先将结果存储为局部变量并重用它就足够了:

field1_count = func.count(Table1.field1)

result = session.query(Table1.field1, Table1.field2, field1_count).filter(
    Table1.user_id == self.user_id).filter(Table1.timestamp > self.from_ts).group_by(
    Table1.field1, Travelog.field2).order_by(desc(field1_count)).first()

生成的 SQL 仍然与您自己的代码生成的 SQL 相同,但至少您不必输入func.count()两次调用。

要给这个列一个明确的标签,调用它的.label()方法

field1_count = func.count(Table1.field1).label('c')

然后您可以在子句中使用相同的标签字符串:order_by

result = session.query(Table1.field1, Table1.field2, field1_count).filter(
    Table1.user_id == self.user_id).filter(Table1.timestamp > self.from_ts).group_by(
    Table1.field1, Travelog.field2).order_by(desc('c')).first()

或者您可以使用以下field1_count.name属性:

result = session.query(Table1.field1, Table1.field2, field1_count).filter(
    Table1.user_id == self.user_id).filter(Table1.timestamp > self.from_ts).group_by(
    Table1.field1, Travelog.field2).order_by(desc(field1_count.name)).first()
于 2013-03-12T13:48:56.017 回答
0

也可以使用c,它是列属性的别名,但在这种情况下,标签将按说明正常工作。

还会指出过滤器不需要多次使用可以通过逗号分隔的标准。

result = (session.query(Table1.field1, Table1.field2,
          func.count(Table1.field1).label('total'))
         .filter(Table1.c.user_id == self.user_id, Table1.timestamp > self.from_ts)
         .group_by(Table1.field1,Table1.field2)
         .order_by(desc('total')).first())
于 2017-03-24T16:56:08.073 回答