sqlite 如何使用Peewee创建具有多个左连接的查询,该查询按日期对所有左连接的右侧进行排序

sqougxex  于 2023-04-06  发布在  SQLite
关注(0)|答案(1)|浏览(201)

我需要使用多个连接对一个查询进行排序,按正确表的any的日期排序-最新的在前。
因此,借用Peewee文档,假设我有一个用户,其中有Tweets和Facebook posts表。我如何创建一个查询,允许我列出用户的所有活动(Tweets和Posts),按日期排序,因此所有活动都是按照时间戳排序的,无论是Tweet还是Post?

import datetime
from peewee import *

db = SqliteDatabase(':memory:')

class BaseModel(Model):
    class Meta:
        database = db

class User(BaseModel):
    username = TextField()

    @property
    def tweets_date_desc (self)
        return self.tweets.order_by(Tweet.timestamp.desc())

    @property
    def posts_date_desc (self)
        return self.posts.order_by(Facebook.timestamp.desc())

class Tweet(BaseModel):
    content = TextField()
    timestamp = DateTimeField(default=datetime.datetime.now)
    user = ForeignKeyField(User, backref='tweets')
    

class Facebook(BaseModel):
    content = TextField()
    timestamp = DateTimeField(default=datetime.datetime.now)
    user = ForeignKeyField(User, backref='posts')

很容易显示每个用户,他们的推文按日期排序,然后他们的帖子按日期排序。

user = User.get(User.username == 'huey')
print (user.username)
for t in user.tweets_date_desc:
    print( t.timestamp, t.content)

for p in user.posts_date_desc:
    print( p.timestamp, p.content)

但是,我不知道如何让这两种类型都按date_of(Tweet或Post)排序。
请注意,我的真实的数据不会像上面的简单示例那样合并到一个“活动”表中。
有什么想法吗

jtw3ybtb

jtw3ybtb1#

通常,你会用UNION来做这件事,例如。

t = (Tweet
     .select(Tweet.content, Tweet.timestamp, User)
     .join(User)
     .where(User.username == 'u1'))
f = (Facebook
     .select(Facebook.content, Facebook.timestamp, User)
     .join(User)
     .where(User.username == 'u1'))

u = (t | f).order_by(SQL('2 desc'))  # Order by 2nd column, timestamp

如果您想加入,可以尝试使用COALESCE:

.order_by(fn.COALESCE(Facebook.timestamp, Tweet.timestamp).desc())

相关问题