2010-10-02 113 views
1

我正在写一个简单的使用Django的私人信使,并正在实施消息线程。Django集团通过

每个系列的消息和回复将有一个唯一的thread_id,这将允许我将消息串组合在一起。但是,在收件箱视图中,所有消息都显示出来了,我只想按thread_id进行分组,因此尽管线程可能有20条消息,但它只会在收件箱中显示一次。

这将会是一个非常简单的

SELECT msg_id, msg_text, subject, from_user_id, to_user_id, date_time, is_read, 
thread_id WHERE to_user_id='foo' GROUP BY thread_id FROM inbox_message; 

不过,我似乎无法使用Django的ORM

任何想法来执行呢?

+0

什么是错误信息?在您的文章中,SQL缺少一个FROM子句... – ars 2010-10-02 04:52:03

+0

whoops - 错误不在SQL语句本身。它在Django中不起作用,原因如下 – 2010-10-02 05:04:32

回答

1

你想用这个SQL语句实现什么?

它将在一些DBMS(即MySQL)上工作,但它不合法。当您使用GROUP BY语句时,您可以只选择您正在分组的列,并汇总(SUM,AVG,COUNT等)。其他列是禁止的,因为DBMS不知道什么数据返回(即它应该返回第一个消息的主题,第二个或什么?)。

如果你不想对线程进行一些总结,除了计算消息,最好的解决方案是给thread表添加新列(你有thread表吗?)。

+0

啊,我明白了。是的,这个查询在MySQL上工作,这就是为什么我认为它是有效的。基本上我所做的只是列出消息,所以我关心的是任何消息的主题行,因为它在答复中保持不变。没有线程表..我只是在相关消息中添加thread_id(例如回复父消息),并根据消息是否具有相同的thread_id来将消息串联在一起。有没有什么办法可以完成我想要做的事情,而无需添加某种父/子标志或线程表?理论上我应该能够通过thread_id进行分组,对吗? – 2010-10-02 04:53:26

+0

是的,问题出在我的数据模型中。感谢您的帮助 – 2010-10-02 05:09:39

+0

如果您确定您的主题完全相同,您可以将其添加到GROUP BY:GROUP BY thread_id,subject。如果你有GROUP BY中的主题,你也可以在SELECT中使用它。但是这个解决方案很糟糕,因为你有数据冗余。有两个很好的解决方案:1.添加线程模型,并在那里移动主题。 2.添加reply_to列(然后您可以使用'reply_to为NULL'在线程中搜索第一条消息并删除'thread_id'列。 – 2010-10-02 05:28:38