PythonPeewee:如何在联接之前在一列上选择不同的值?

2024-06-16 09:25:53 发布

您现在位置:Python中文网/ 问答频道 /正文

在使用python ORM peewee仅在第一个表的一列上选择不同的值之后,我尝试将第二个表(PageLikes)连接到第一个表(PageVisits)上

在纯SQL中,我可以做到这一点:

SELECT DISTINCT(pagevisits.visitor_id), pagelikes.liked_item FROM pagevisits
INNER JOIN pagelikes on pagevisits.visitor_id = pagelikes.user_id

在peewee with python中,我尝试过:

query = (Page.select(
         fn.Distinct(Pagevisits.visitor_id),
         PageLikes.liked_item)
         .join(PageLIkes)

这给了我一个错误: distinct() takes 1 positional argument but 2 were given

我唯一可以且曾经使用distinct与peewee的方法是:

query = (Page.select(
         Pagevisits.visitor_id,
         PageLikes.liked_item)
         .distinct()

这似乎不适用于我的场景

那么,在使用peewee连接另一个表之前,如何基于一列在一个表中只选择不同的值呢


Tags: idpageormitemqueryselectpeeweevisitor
2条回答

正如Papooch所建议的,在模型上调用distinct似乎是可行的:

distinct_visitors = (Pagevisits
                            .select(
                                Pagevisits.visitor_id.distinct().alias("visitor")
                            )
                            .where(Pagevisits.page_id == "Some specifc page")
                            .alias('distinct_visitors')
                            )


query = (Pagelikes
         .select(fn.Count(Pagelikes.liked_item),
         )
         .join(distinct_visitors, on=(distinct_visitors.c.visitor = Pagelikes.user_id))
         .group_by(Pagelikes.liked_item)
         )

我认为您不应该以这种方式使用fn.DISTINCT()时遇到错误。我很想看到完整的回溯。在本地测试中,我在运行以下内容时没有问题:

query = (PageVisits
         .select(fn.DISTINCT(PageVisits.visitor_id), PageLikes.liked_item)
         .join(PageLikes))

它生成的SQL与您所追求的内容相当。顺便说一句,我使用的是最新的peewee代码

相关问题 更多 >