SQLAlchemy中的选择和最大值不同

时间:2015-08-12 09:58:41

标签: python sqlite sqlalchemy pyramid

我有下表:

id | user_id | name | value
----------------------------
1  |       1 | so   | 1
2  |       1 | os   | 2
3  |       2 | so   | 3
4  |       2 | os   | 4
5  |       2 | os   | 7

如何使用 name ==“os”和 max value >选择不同的用户行)使用sqlalchemy的值列表

附加, 可能无用 ,信息:我正在使用sqlalchemy和金字塔

这与我的尝试类似:

ResVar = DBSession.query(tableModel.id, tableModel.user_id, tableModel.name, tableModel.value, func.max(tableModel.value)).filter(tableModel.value.in_(list(checkList))).filter(tableModel.name == "so").group_by(tableModel.user_id).all()

这与我的模特类似:

class tableModel(Base):
    __tablename__ = 'table'
    id = Column(Integer,primary_key=True)
    name = Column(String(100))
    value = Column(String(200))
    user_id = Column(Integer,ForeignKey('user.id'))
    user = relationship("user",foreign_keys=[user_id])

    def __init__(self, user_id,name,value):
        self.user_id = user_id
        self.name = name
        self.value = value

预期结果:

1 |    1 | so  | 1
3 |    2 | so  | 3

1 个答案:

答案 0 :(得分:0)

由于SQLite不支持DISTINCT ON,我们必须使用GROUP BY user_id

T = tableModel
q = session.query(T.id, T.user_id, T.name, func.max(T.value)) \ 
           .filter(T.name=='so') \
           .filter(T.value.in_([1, 2, 3, 4])) \
           .group_by(T.user_id)

导致以下行:

(1, 1, u'so', u'1')
(3, 2, u'so', u'3')