消息和回复按摩功能

时间:2015-09-16 06:56:28

标签: mysql

我们有一个名为message的表。

CREATE TABLE IF NOT EXISTS `message` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`from_user_id` int(11) NOT NULL,
`to_user_id` int(11) NOT NULL,
`content` text NOT NULL,
`club_id` int(11) NOT NULL,
`read_flag` int(11) NOT NULL DEFAULT '0',
`parent_id` int(11) NOT NULL,      
`status` tinyint(1) DEFAULT NULL,
`create_user_id` int(11) NOT NULL,
`update_user_id` int(11) NOT NULL,
`create_dt_tm` datetime NOT NULL,
`update_dt_tm` datetime NOT NULL,
`delete_flag` tinyint(1) NOT NULL DEFAULT '0',
 PRIMARY KEY (`id`)
) 

需要显示消息并回复用户的消息。 表中的条目将是这样的,

id | from_user_id | to_user_id | content | parent_id
1  | 2            | 3          | hai     | 0
2  | 3            | 2          | hi      | 1
3  | 3            | 2          | hwru    | 1
4  | 3            | 4          | hwru    | 1
5  | 4            | 5          | u added | 1
6  | 4            | 5          | new msg | 0

这是流程,  假设2 => A,3 => B,4 => C,5 => d,

  • A向B发送消息
  • B回复该消息
  • B通过添加新收件人C再次发送一个回复C
  • C通过添加新收件人D
  • 再次回复该主题
  • 此线程的所有用户都应该能够阅读完整的消息线程。
  • A,B,C和D可以看到所有(1,2,3,4,5)消息,如果他们登录除了第6次
  • 第6条消息只有C和D可以看到并且它是一个不同的线程

我现在正在使用的两个查询

  1. 一个用于列出所有消息。
  2. 其次是查看该消息的详细信息(当用户点击该消息时,将显示与该消息相关的所有线程)。
  3. 通过使用单个查询,我需要向登录用户显示所有线程。 请帮助一些人为此选择查询。

2 个答案:

答案 0 :(得分:1)

您的存储类型称为Adjacency list,即只在parent_id列中存储直接父ID。

查询节点的孩子:

mysql> SELECT * FROM message m1 INNER JOIN message m2 ON m2.parent_id = m1.id  WHERE m1.id = 1;
+----+--------------+------------+---------+-----------+----+--------------+------------+---------+-----------+
| id | from_user_id | to_user_id | content | parent_id | id | from_user_id | to_user_id | content | parent_id |
+----+--------------+------------+---------+-----------+----+--------------+------------+---------+-----------+
|  1 |            2 |          3 | hai     |         0 |  2 |            3 |          2 | hi      |         1 |
|  1 |            2 |          3 | hai     |         0 |  3 |            3 |          2 | hwru    |         1 |
|  1 |            2 |          3 | hai     |         0 |  4 |            3 |          4 | hwru    |         1 |
|  1 |            2 |          3 | hai     |         0 |  5 |            4 |          5 | u added |         1 |
+----+--------------+------------+---------+-----------+----+--------------+------------+---------+-----------+
4 rows in set (0.00 sec)

如果您想要扁平结构,可以执行以下查询:

mysql> select * from message m WHERE id = 1 OR parent_id = 1;
+----+--------------+------------+---------+-----------+
| id | from_user_id | to_user_id | content | parent_id |
+----+--------------+------------+---------+-----------+
|  1 |            2 |          3 | hai     |         0 |
|  2 |            3 |          2 | hi      |         1 |
|  3 |            3 |          2 | hwru    |         1 |
|  4 |            3 |          4 | hwru    |         1 |
|  5 |            4 |          5 | u added |         1 |
+----+--------------+------------+---------+-----------+
5 rows in set (0.00 sec)

Adjacency list有严重的缺点:很难对深层嵌套树进行查询(我们只在这里查询消息#1的直接子节点)。

请查看Bill Karwin的linked question以及此excellent presentation以获取其他选项。

答案 1 :(得分:1)

使parent_id的默认值为NULL。获取允许用户查看的线程,替换< thisuserid>用户ID

.remove

获取整个帖子,包括发送给许多收件人时的重复,因为我无法想到一种简单的方法来过滤它们,因为它们被存储为单独的邮件。替换< thisuserid>用户ID

db.collection.remove({ "Date": { "$lt": new Date("10-14-2014")} }

虽然,我会完全将收件人与邮件本身分开,不仅可以更轻松地查询整个链,还可以节省空间。他们现在就这样做了,每个新的邮件收件人都会增加所需的存储量,其数量等于邮件的大小,这可能会很快失控。

SELECT DISTINCT(COALESCE(parent_id, id)) thread_id FROM message m WHERE from_user_id = <thisuserid> OR to_user_id = <thisuserid>

获取线程用户可以查看

SELECT * from message m WHERE id = <threadid> OR parent_id = <threadid>

获取整个帖子

CREATE TABLE IF NOT EXISTS `message` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`from_user_id` int(11) NOT NULL,
`content` text NOT NULL,
`parent_id` int(11),      
 PRIMARY KEY (`id`)
); 

CREATE TABLE IF NOT EXISTS `message_to` (
`message_id` int(11) NOT NULL,
`recipient_id` int(11) NOT NULL,
`read_flag` int(11) NOT NULL DEFAULT '0',
`status` tinyint(1) DEFAULT NULL,
`delete_flag` tinyint(1) NOT NULL DEFAULT '0',
UNIQUE KEY (`message_id`, `recipient_id`)
);


INSERT INTO message VALUES (1, 2, 'hai', null), (2, 3, 'hi', 1), (3, 3, 'hwru', 1), (4, 4, 'u added', 1), (5, 4, 'new msg', null);
INSERT INTO message_to (`message_id`, `recipient_id`) VALUES (1,3), (2,2), (3,2), (3,4), (4,5), (5,5);