2011-05-11 24 views
0

私はプライベートメッセージングスクリプトを作成しています。しかし、私はMySQLの最後にいくつかの問題に遭遇しました。私は部分的に働いている。同じ親IDを持つ行をグループ化する

例:

messageid | parentid | subject | flags 
1   NULL  'Foobar' 2  //has been read 
2   1   'Foobar' 2  //has been read 
3   1   'Foobar' 1  //has not been read 

メッセージID:オートインクリメントメッセージ
のParentIDの:スレッド内の最初のメッセージのメッセージID
被写体:被験者(またはタイトル)スレッドの
フラグ:ビット単位のフラグ(1 =未読、2 =読み取り)


1.私はそれを今セットアップしている方法で、私のスクリプトは未読メッセージページと読まれたメッセージページにメッセージスレッドを表示します。私の目標は、それが読み取られるまで未読メッセージページだけに表示させることです。ここで

は私のクエリ

//$_GET['node'] is allowed to be: unread, read, or sent 
$wftype = $_GET['node'] == 'sent' ? 'sender' : 'recipient'; 
$filter = $_GET['node'] == 'sent' ? '' : ' AND (`flags` & '.$message_flags[$_GET['node']].') != 0'; 
//$filter = ($_GET['node'] == 'unread' || $_GET['node'] == 'read') ? ($_GET['node'] == 'read' ? ' AND (`flags` & '.$message_flags['read'].') != 0' : ' AND (`flags` & '.$message_flags['unread'].') != 0') : ''; 
$result = $sql->query('SELECT `messageid`, `parent`, `senderid`, `sender`, `subject`, MAX(`sendtime`) AS `sendtime` FROM `memberpostbox` WHERE `'.$wftype.'id` = '.$_SESSION['client']['number'].$filter.' AND (`flags` & '.$message_flags[$wftype.'_deleted'].') = 0 GROUP BY `parent` ORDER BY `sendtime` DESC'); 

は私が私のテーブルを再構築したり、完全に私はこれをやっている方法を変更する必要がありますでしょうか?それとも、これは私が今持っているもので達成できますか?メッセージが読み取られているかどうかだけフラグが決定されている未読メッセージ読み出しメッセージ

'SELECT .... FROM memberpostbox WHERE flag=2' 

ため

'SELECT .... FROM memberpostbox WHERE flag=1' 

について

追加情報
表構造

CREATE TABLE IF NOT EXISTS `memberpostbox` ( 
    `messageid` bigint(20) unsigned NOT NULL auto_increment, 
    `parentid` int(10) unsigned default NULL, 
    `senderid` varchar(255) collate utf8_unicode_ci NOT NULL, 
    `sender` varchar(255) collate utf8_unicode_ci NOT NULL, 
    `recipientid` varchar(255) collate utf8_unicode_ci NOT NULL, 
    `recipient` varchar(255) collate utf8_unicode_ci NOT NULL, 
    `subject` varchar(255) collate utf8_unicode_ci default NULL, 
    `message` longtext collate utf8_unicode_ci NOT NULL, 
    `sendtime` int(10) unsigned NOT NULL, 
    `flags` tinyint(3) unsigned NOT NULL default '0', 
    PRIMARY KEY (`messageid`), 
    KEY `groupid` (`parentid`), 
    FULLTEXT KEY `search` (`subject`,`message`) 
ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=22 ; 

答えて

0

、それはdに関わる唯一の部分になるでしょう正しいリストを表示する.....もちろん、残りのコードをそこに追加する必要があります。

// read 
$result = $sql->query(
    'SELECT 
     `messageid`, 
     `parent`, 
     `senderid`, 
     `sender`, 
     `subject`, 
     MAX(`sendtime`) AS `sendtime` 
    FROM `memberpostbox` 
    WHERE `recipientid` = '.$_SESSION['client']['number'].$filter.' 
    AND `flags` = 2 
    AND '.$message_flags[$wftype.'_deleted'].' = 0 
    GROUP BY `parent` 
    ORDER BY `sendtime` DESC' 
);  
+0

私のコードはちょっと混乱します。私はもともとそれをあなたのやり方でやった。しかし、私は2つ以上のビットフラグをメッセージ用に定義しています。 すべてのフラグは、未読、読み取り、受信者削除、送信者削除です。これらは 'flags'のdbフィールドに格納されます(最大15まで)。 メッセージ受信者がメッセージを「削除」しているときに、メッセージ送信者が同じメッセージを送信する場合は、recipient_deletedが設定されます。私は紛争を避けるためにこのようにします。 EX)送信者がメッセージを削除する場合は、受信者がメッセージを削除しない限り、受信者はそれを表示することができます。 – Kairu

+0

Uはあなたがフラグの列挙データ型を検討すべきであるよりも、特定の値のリストを持っている、とあなたはまだフラグを設定するために、現在の変数を使用することができます。また、あなたは、あなたがやりたい仕事のddifferentタイプごとに関数を使うことを検討すべきだと思います。例えば、mark_as_read()のdelete()などです。 – Ibu

関連する問題