【发布时间】:2015-08-21 08:15:49
【问题描述】:
我正在用 MySQL 实现一个聊天系统,使用 SQLAlchemy 作为我的 ORM。
我的表有以下列:id, from_user_id, to_user_id, message, time_sent.
我正在尝试创建一个查询,在该查询中我选择包含从每个对话发送的最新消息的记录。这与人们在 Facebook 上看到的对话列表完全相同。
关于如何做到这一点的任何想法?
这是我目前所拥有的:
latest_msg_sq = (DBSession.query(func.max(Message.id).label("max_id"))
.group_by(Message.from_user)).subquery()
matching_conv = DBSession.query(Message)
.join(latest_msg_sq, and_(Message.id ==
latest_msg_sq.c.max_id)).order_by(Message.time_sent.desc())
不幸的是,它不能很好地工作,因为它只获取 from_user_id 的最新消息。我还需要它来考虑来自 to_user_id 的消息,而 group_by 似乎不是最好的方法。在我看来,我认为我需要将记录 from_user_id 和 to_user_id 视为无序对,然后在这些对上使用 group_by。但是,我不知道该怎么做。
【问题讨论】:
-
聊天应用程序通常有一个 room 抽象,它们使用自己的唯一 id 实现。与其尝试将
from_user_id加上to_user_id变成对话,不如让messages表具有以下列:id, owner, room, message, time_sent,这样您可以通过room选择并按@ 排序987654328@.
标签: python mysql sql sqlalchemy