处理消息表和相应的响应

时间:2013-09-11 18:13:10

标签: mysql

我正在试图找出处理两个表之间关系的最佳方法。第一个表存储新消息和发布消息的人的UID;

+-----------+--------+-------------------+-----------+
| messageid | userid | subject           | message   |
+-----------+--------+-------------------+-----------+
|         1 |     70 | Subject           | Message   |
|         4 |     70 | Subject           | Message   |
|         5 |     63 | Subject           | Message   |
|         6 |     67 | Test              | Test      |
|         7 |     67 | Another test, yo' | Test, yo' |
+-----------+--------+-------------------+-----------+

第二个表包含有权访问相应邮件的收件人列表。

+-----------+--------+
| messageid | userid |
+-----------+--------+
|         1 |     63 |
|         1 |     68 |
|         1 |     69 |
+-----------+--------+

我的问题是,因为收件人表中的messageid列依赖于messages表中的同一列,将信息插入收件人表的最佳方法是什么? Messageid是在发布消息时创建的,所以我会在消息表中查询messageid,将其转换为变量并使用该变量插入到recipients表中吗?还是有更实用的方法?

1 个答案:

答案 0 :(得分:1)

如果您使用自动增量列创建`message.messageId列值,则可以使用MySQL LAST_INSERT_ID()函数在后续语句中检索其值。

所以你可以这样做:

 INSERT INTO message (userid, subject, message) VALUES (70, 'Subject', 'Message');
 SELECT LAST_INSERT_ID();

在程序中检索该值。然后做一系列的

 INSERT INTO recipient (messageid, userid) VALUES (value, userid);

如果出于某种原因,您需要在客户端程序中检索并使用LAST_INSERT_ID()而不需要执行此操作,则可以执行以下SQL语句序列。

INSERT INTO message (userid, subject, message) VALUES (?, ?, ?);

INSERT INTO recipient (messageid, userid)
SELECT a.messageid, b.userid
  FROM (
         SELECT LAST_INSERT_ID() AS messageid
       ) AS a
  JOIN (
       SELECT ? AS userid
       UNION ALL
       SELECT ? AS userid
       UNION ALL
       SELECT ? AS userid
  ) AS b;

UNION ALLJOIN允许在一个SQL语句中插入一堆userid,所有这些都来自LAST_INSERT_ID()的相同值。