【问题标题】:Mysql and PHP inbox updateMysql 和 PHP 收件箱更新
【发布时间】:2012-03-28 22:49:47
【问题描述】:

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

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' 并作为每个用户 ID 的新查询插入来实现这一点。这是我的代码:

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 中找到任何与我的问题相关的明确答案。

【问题讨论】:

  • 天啊。您听说过规范化数据和良好的相对数据库设计吗?
  • 使用 usermessage 表上的时间戳字段(使用类似 ON UPDATE CURRENT_TIMESTAMP 之类的东西)和选择显示收件箱的更明智的 ORDER BY 会更好地实现这一点。
  • 不应该 12 发送到 13 只是创建一个新行,你不应该回收消息 ID。
  • @heximal 你的批评性评论有什么帮助?请更具建设性。链接,示例任何内容。
  • @heximal 虽然我完全同意,但我希望普通表单在这个优先级列表中排在后面:-)

标签: php mysql sql-insert sql-delete inbox


【解决方案1】:

在没有 SORT 语句的情况下查询行不能保证它们将按照创建的时间顺序进行排序。从现在开始,MySQL 给你这样的排序行为只是一个机会。

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

同样值得注意的是,删除和重新创建行会影响 MySQL 进程成本,因为每次删除和插入时 MySQL 都需要更新 [usermessage] 表上的索引。

【讨论】:

  • 谢谢。时间戳是一个确定的答案。
猜你喜欢
  • 2015-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-13
  • 2010-12-17
相关资源
最近更新 更多