Facebook喜欢消息系统 - 按上次回复排序

时间:2012-04-23 05:35:18

标签: php mysql database messaging

我正在构建一个类似于facebook的消息传递系统(它将消息显示为线程)。

我目前的表设计是:

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语句检索结果:

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

这给了我正确的结果,除了它显示一个帖子的第一个帖子,我希望它能在一个帖子中显示最近的帖子。

我做错了什么?

1 个答案:

答案 0 :(得分:4)

这是一篇与您的问题直接相关的好文章: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

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