2012-03-28 48 views
0

我已经创建了一个收件箱系统。用户登录可以向其他登录用户发送消息。来自数据库的usermessage表有两个字段1. userid和2. messageid。以下是此表的摘录。Mysql和PHP收件箱更新

userid | messageid 
12  | 1 
13  | 1 
14  | 2 
15  | 2 
12  | 3 
15  | 3 
12  | 4 
14  | 4 

在上述情况下,用户'12'向用户'13'发送消息。我希望messageid'1'移动到表格的底部,以便当用户'12'或'13'正在检查他的邮箱时,messageid'1'需要作为最近的对话出现在收件箱的顶部。到目前为止,我已经能够通过删除messageid'1'并插入作为每个用户标识的新查询来实现此目的。这是我的代码:

DELETE FROM usermessage WHERE userid = '12' and messageid = '1'; 
INSERT INTO usermessage SET userid = '12', messageid = '1'; 
DELETE FROM usermessage WHERE userid = '13' and messageid = '1'; 
INSERT INTO usermessage SET userid = '13', messageid = '1'; 

是否有可能通过一个查询来完成此操作。到目前为止,我无法在与我的问题相关的stackflow中找到任何明确的答案。

+1

OMG。你有没有听说过正常化数据和良好的相对数据库设计? – heximal 2012-03-28 22:52:56

+0

用户消息表上的时间戳字段(使用类似于ON UPDATE CURRENT_TIMESTAMP的内容)和用于显示收件箱的select上的更明智的ORDER BY可以更好地实现此目的。 – cmbuckley 2012-03-28 22:53:54

+0

不应该12发送到13只是创建一个新的行,你不应该回收消息ID。 – 2012-03-28 22:54:29

回答

0

没有SORT语句查询行没有给出担保,他们将在创建的时间顺序进行排序。从现在起,MySQL只是给你一个这样的排序行为。

因此,您需要找到或创建一个客观的排序规则。它可以是消息的时间戳,也可以是[usermessage]表中的新时间戳列。

这也是明显的,删除并重新创建行会影响MySQL的工艺成本,因为MySQL将需要每次删除和插入的时间来更新[usermessage]表中的索引。 OMG。

+0

谢谢。时间戳是一个明确的答案。 – Hari 2012-03-28 23:21:36