php - mysql php 私密邮箱之类的消息系统

标签 php mysql database-connection messaging

我正在为我的应用程序构建一个小型消息传递系统,主要想法是有 2 个表。 表1消息

Id,sender_id,title,body,file,parent_id

这里是消息的存储位置,与接收消息的人分离以允许多个接收者。

Parent 如果是回复,我会链接到父消息,文件是一个 blob,用于存储附加到消息的单个文件

表2 message_users

Id,thread_id,user_id,is_read,stared,deleted

将父线程链接到目标用户,

现在我可以为单个用户统计未读消息数

Select count(*) from message_users where user_id = 1 and is_read is null

我可以计算他收件箱中的所有邮件数量

Select count(*) from message_users where user_id = 1;

问题是如何在单个优化查询中结合两者?

最佳答案

因此,您正在尝试实现将满足一个条件的总行数和满足额外条件的总行数的结果:

|---------|---------|
| total   | unread  |
|---------|---------|
| 20      | 12      |
|---------|---------|

因此需要具有以下形式的东西:

SELECT A total, B unread FROM message_users WHERE user_id=1

A 相当简单,您或多或少已经拥有它:COUNT(Id)

B 稍微复杂一些,可能采用 SUM( IF(is_read IS NULL,1,0) ) 的形式——每次 is_read 不为空时加 1 ;条件将取决于您的数据库细节。

B 可能看起来像:COUNT(CASE WHEN is_read IS NULL THEN 1 END) unread——这是说“当 is_read 为 null 时,再计数 1” ;条件将取决于您的数据库细节。

总计:

SELECT COUNT(Id) total, COUNT(CASE WHEN is_read IS NULL THEN 1 END) unread FROM message_users WHERE user_id=1

或者:

SELECT COUNT(Id) total, SUM( IF(is_read IS NULL,1,0) ) unread FROM message_users WHERE user_id=1

就优化而言,我不知道有比这更快的查询。 (如果它确实存在,我很想知道它!)如果您遇到性能问题,可能有一些方法可以加快速度:

  • 检查您的索引:使用内置工具 EXPLAIN 和一些阅读等。
  • 使用缓存和/或预先计算值并将其存储在别处——例如对 user 有一个字段 unread_messages 并直接获取该值。显然需要一些写时失效,或者确实需要运行一些服务来使这些值保持最新。有很多方法可以实现这一点,MySQL 中的工具,您自己的手动工具等。
  • 简而言之,从需求和一些实际数据开始优化。 (我的查询需要 0.8 秒,我需要在 0.1 秒内得到结果,并且它们需要在 100% 的时间内保持一致——我怎样才能做到这一点?)然后您可以调整 SQL 并进行试验,服务器运行的硬件(也许?),在不同点缓存/预计算等。

关于php - mysql php 私密邮箱之类的消息系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29329537/

相关文章:

python - 如何修复 Mac OS 上的 mysql django 连接?我已经安装了 mysqlclient 但显示 "Did you install mysqlclient?"错误

PHPMyAdmin 内联编辑文本字段中损坏的序列化数据

php - 通过PHP获取MySQL慢查询日志的位置

php - str_split并从mysql获取数据

java - 在运行时 eclipse 应用程序中建立 mysql/java/jdbc 连接

c# - 我是否需要使用 using 关键字关闭 SQL Server 连接?

php mysql 多对多关系查询结果显示

php - 不使用 UTC 显示时区

mysql - 如何计算过去同一时间间隔的记录数?

mysql - 根据组合条件查找 MySQL 中的重复值