Facebook喜欢消息系统 - 排序最后回复

问题描述:

我正在构建一个类似于Facebook的消息系统(它显示消息为线程)。Facebook喜欢消息系统 - 排序最后回复

我现在的表设计是:

与此select语句
CREATE TABLE IF NOT EXISTS messages ( 
    mid int(11) NOT NULL auto_increment, 
subject text NOT NULL, 
    message text NOT NULL, 
    fromid varchar(255) NOT NULL default '', 
    toid varchar(255) NOT NULL default '', 
    status varchar(255) NOT NULL default '', 
    date varchar(255) NOT NULL default '', 
    time varchar(255) NOT NULL, 
    PRIMARY KEY (mid) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=2825 ;` 

我检索结果:

SELECT 
    IF(messages.toid = '$uid' OR messages.toid = '$uid', messages.fromid, messages.toid) friend1, 
messages.message, messages.fromid, messages.toid, messages.date, messages.status, messages.time 
FROM messages 
WHERE (messages.toid='$uid' OR messages.fromid='$uid') 
    AND messages.status!='2' 
GROUP BY friend1 ASC 
ORDER BY messages.time DESC, messages.mid DESC 

这给了我正确的结果,除了它显示的第一篇文章从一个线程,我想让它在线程中显示最近的帖子。

我在做什么错?

+0

确实放置了一个Facebook标记。 – hjpotter92 2012-04-23 05:43:34

这是一个很好的文章直接关系到你的问题:http://kristiannielsen.livejournal.com/6745.html

在您的具体问题,以野生刺,您的查询可能会需要类似于下面(未经测试!):

SELECT 
    IF(derived_messages.toid = '$uid', derived_messages.fromid, 
    derived_messages.toid) friend1, 
    derived_messages.message, derived_messages.fromid, derived_messages.toid, 
    derived_messages.date, derived_messages.status, derived_messages.time 
FROM 
    (SELECT * 
    FROM messages 
    ORDER BY time desc) derived_messages 
WHERE (derived_messages.toid='$uid' OR derived_messages.fromid='$uid') 
    AND derived_messages.status!='2' 
GROUP BY friend1 ASC 
ORDER BY derived_messages.time DESC, derived_messages.mid DESC 

顺便说一下这个条款看起来腥,我(在你的原帖):

IF(messages.toid = '$uid' OR messages.toid = '$uid', 
    messages.fromid, messages.toid) friend1 

什么是“或”相同的条件之间在做什么?我想可以跳过第二个条件。

+0

令人惊叹。这很好。 – 2012-04-23 06:59:46

+0

我有一个额外的问题延伸到你的答案上(如果你不介意并且允许的话); 我有一个表,称为配置文件,我想加入它获得用户名上的朋友1 = profiles.uid - 我将如何去了解这个查询? – 2012-04-23 07:04:50

+1

恐怕要加入分组结果,你需要第三个嵌套选择,一个外部“SELECT * FROM(...)结果”,然后使用“INNER JOIN profiles ON(profiles.uid = results.friend1 )任何人都有更好的方法? – 2012-04-23 07:13:40