代码之家  ›  专栏  ›  技术社区  ›  mimic

SQLAlchemy:只选择那些没有子记录的家长

  •  0
  • mimic  · 技术社区  · 10 月前

    我有两张桌子:聊天和聊天信息。我只想获得那些没有来自用户的聊天消息的聊天(他们可能有来自管理员等其他来源的消息)。

    这段代码返回0条记录,我不明白为什么:

    message_count_subquery = db.session.query(
                    ChatMessage.chat_id,
                    func.count(ChatMessage.id).label('message_count')
                ).filter(ChatMessage.origin == 'user').group_by(ChatMessage.chat_id).subquery()
    
    message_count_alias = aliased(message_count_subquery)
    
    chats = db.session.query(Chat).join(
                        message_count_alias,
                        Chat.id == message_count_alias.c.chat_id
                    ).filter(
                        (message_count_alias.c.message_count == None) | (message_count_alias.c.message_count == 0)
                    ).all()
    

    当我想要相反的结果时,它就起作用了,用这个版本查找所有记录,其中至少有一条来自用户的消息:

    chats = db.session.query(Chat).join(EnumChatMessage).join(
                        message_count_alias,
                        Chat.id == message_count_alias.c.chat_id
                    ).filter(
                        and_(message_count_alias.c.message_count > 0)
                    ).all()
    
    2 回复  |  直到 10 月前
        1
  •  1
  •   Ian Wilson    10 月前

    可能需要 outerjoin 而不是 join .

        2
  •  1
  •   Kamo Petrosyan    10 月前

    的代码 @Ian Wilson 的答案

    message_count_subquery = aliased(
        select(
            ChatMessage.chat_id,
            func.count(ChatMessage.id).label('message_count')
        ).filter(
            ChatMessage.origin == 'user'
        ).group_by(
            ChatMessage.chat_id
        ).subquery()
    )
    
    chats = db.session.query(Chat).outerjoin(
        message_count_alias,
        Chat.id == message_count_alias.c.chat_id
    ).filter(
        or_(message_count_alias.c.message_count.is_(None), message_count_alias.c.message_count == 0)
    ).all()