我有一个像col1,col2,col3,col4,col5这样的表。我想选择col3的不同值,我的查询如下所示:
db().select(db.table.col1, db.table.col3, distinct=db.table.col3)
查询失败。
答案 0 :(得分:2)
除非使用@Anthony提到的postgresql,否则对于所有其他关系数据库(afaik),distinct不能应用于结果集的各个字段,除了所有字段。 Web2py将其与参数使用相关联。这可以设置为True,或者设置为所有请求的字段。正如书中所示,我引用了相关内容以方便您使用。
如果您使用sqlite,请使用Anthony提及的groupby
并应用聚合,例如:db().select(db.table.col1.max(), db.table.col3.max(), groupby=db.table.col3)
希望这会有所帮助。
从web2py手册aggregates section:
不同
使用参数distinct = True,您可以指定只想选择不同的记录。这与使用所有指定字段进行分组具有相同的效果,除了它不需要排序。当使用distinct时,重要的是不要选择所有字段,特别是不要选择“id”字段,否则所有记录将始终是不同的。
以下是一个例子:
>>> for row in db().select(db.person.name, distinct=True):
print row.name
亚历
鲍勃
卡尔
请注意,distinct也可以是表达式,例如:
>>> for row in db().select(db.person.name,distinct=db.person.name):
print row.name
亚历
鲍勃
卡尔
答案 1 :(得分:0)
如果将distinct
设置为表达式(例如Field对象),则会生成DISTINCT ON
SQL语句,我相信SQLite不支持该语句。它应该在PostgreSQL中工作。作为替代方案,您可以尝试:
db().select(db.table.col1, db.table.col3, groupby=db.table.col3)
但是,无论哪种方式,您可能会遗漏一些col1
的不同值,因为您没有进行任何聚合。