2

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

これにより、スレッドからの最初の投稿が表示されることを除いて、正しい結果が得られます。スレッドの最新の投稿を表示したいと思います。

私は何を間違っていますか?

4

1 に答える 1

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」は何をしているのですか? おそらく2番目の条件をスキップできると思います。

于 2012-04-23T06:56:00.210 に答える