Fai*_*ool 5 php mysql sql database-design
我正在尝试在PHP和mySQL中创建线程消息传递系统。我的消息表如下
SELECT `es_id`, `es_fid`, `es_tid`, `es_subject`, `es_message`, `es_onstamp`, `es_msg_read`, `es_f_del`, `es_t_del`, `threadid` FROM `esb2b_messages`
Run Code Online (Sandbox Code Playgroud)
在这张桌子
es_id = primary key for the table.
es_fid = This field store the from user id.
es_tid = This field store the to user id.
es_subject = This field store the subject of message.
es_message = This field store the body of message.
es_onstamp = This field store the time stamp.
es_msg_read = This field store if receiver open the message.
es_f_del = This field store if the from user delete this message.
es_t_del = This field store the the to user delete this message.
threadid = This field store the id of parent message(es_id of the replied message).
Run Code Online (Sandbox Code Playgroud)
请参考此图片以清楚地了解我要存档的内容。
http://oi59.tinypic.com/2wdav45.jpg
在上图中,这4条消息的组合创建了一个线程。
对收件箱和已发送邮件的查询应该是什么。现在,我正在对收件箱使用此查询,但是每条消息都是单独的。
SELECT `es_id`, `es_fid`, `es_tid`, `es_subject`, `es_message`, `es_onstamp`, `es_msg_read`, `es_f_del`, `es_t_del`, `threadid` FROM `esb2b_messages` WHERE `es_tid`= UNHEX('$Loginuser') ORDER BY `esb2b_messages`.`es_onstamp` DESC
Run Code Online (Sandbox Code Playgroud)
另请参阅此图像以查看当前输出的内容以及我想要的内容。
请注意:收件箱应排序并仅按线程中收到的最后一条消息显示。相同的已发送项目应仅按线程中发送的最后一条消息进行排序和显示。
的SQL
CREATE TABLE IF NOT EXISTS `esb2b_messages` (
`es_id` bigint(20) NOT NULL AUTO_INCREMENT,
`es_fid` bigint(20) NOT NULL DEFAULT '0',
`es_tid` bigint(20) NOT NULL DEFAULT '0',
`es_subject` mediumtext NOT NULL,
`es_message` longtext NOT NULL,
`es_tempdate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`es_onstamp` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`es_msg_read` varchar(10) NOT NULL DEFAULT '',
`es_f_del` varchar(10) NOT NULL DEFAULT '',
`es_t_del` varchar(10) NOT NULL DEFAULT '',
`threadid` varchar(255) NOT NULL DEFAULT '0',
PRIMARY KEY (`es_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=367 ;
--
-- Dumping data for table `esb2b_messages`
--
INSERT INTO `esb2b_messages` (`es_id`, `es_fid`, `es_tid`, `es_subject`, `es_message`, `es_tempdate`, `es_onstamp`, `es_msg_read`, `es_f_del`, `es_t_del`, `threadid`) VALUES
(361, 3, 23, ' Quotation for Embossed and watermark Certificate Printing', 'Hello, this is Bella, we specilized in providing variable data printing services for eight years and we can make it according to your detail requests. Could you please send your original artpaper sothat we can discuss it in details? Looking forward to hearing from you soon. My skype is kingwin1688.', '2014-08-23 22:40:39', '2014-08-23 21:59:55', 'Yes', 'No', 'No', '0'),
(360, 2, 23, 'test', 'asgdfgdfsgdf', '2014-08-23 19:39:11', '2014-08-19 02:35:09', 'Yes', 'No', 'No', '0'),
(363, 2, 23, 'not threaded', 'asgdfgdfsgdf', '2014-08-23 23:29:28', '2014-08-19 02:35:09', 'Yes', 'No', 'No', '0'),
(362, 23, 2, ' Quotation for Embossed and watermark Certificate Printing', 'Hello, this is Bella, we specilized in providing variable data printing services for eight years and we can make it according to your detail requests. Could you please send your original artpaper sothat we can discuss it in details? Looking forward to hearing from you soon. My skype is kingwin1688.', '2014-08-23 19:39:15', '2014-08-23 21:59:55', 'No', 'No', 'No', '0'),
(364, 23, 2, 'reply', 'my first reply', '2014-08-23 21:41:11', '2014-08-23 02:35:09', 'No', 'No', 'No', '360'),
(365, 2, 23, 'this is reply of reply', 'reply of reply', '2014-08-23 22:41:26', '2014-08-24 02:35:09', 'Yes', 'No', 'No', '360'),
(366, 23, 2, 'reply', 'my first reply', '2014-08-23 21:41:11', '2014-08-24 02:35:09', 'No', 'No', 'No', '360');
Run Code Online (Sandbox Code Playgroud)
链接到sql小提琴 http://www.sqlfiddle.com/#!2/9def4/1/0
es_fid和es_tid是用户表的外键。
收件箱的输出应为
来自| 主题| 留言| 时间戳记
在组中
让我解释一下该系统的工作方式,如果'threadid'为0,则表示该行是父级。如果行中的“线程ID”不为零,则表示它是一个父级的子级。我希望每当用户转到收件箱时,如果退出则仅显示子项中最新接收的信息,否则显示父项。
谢谢。
小提琴: http ://www.sqlfiddle.com/#!2/9def4/13/0
select es_id, es_fid, es_subject, es_message, es_onstamp
from esb2b_messages x
where threadid = 0
and es_tid = 23
and not exists (select 1
from esb2b_messages y
where y.threadid = x.es_id
and y.es_tid = x.es_tid)
union all
select es_id, es_fid, es_subject, es_message, es_onstamp
from esb2b_messages x
where threadid <> 0
and es_tid = 23
and es_onstamp = (select max(y.es_onstamp)
from esb2b_messages y
where y.threadid = x.threadid)
order by es_id, seq, es_onstamp
Run Code Online (Sandbox Code Playgroud)
正如评论中所讨论的,360 现在已缩减为最新的子级。
其他线程没有子线程,因此显示父线程。如果他们确实有孩子,则会显示最新的孩子。
| 归档时间: |
|
| 查看次数: |
1099 次 |
| 最近记录: |