mysql - 从消息线程中获取嵌套的未读消息

标签 mysql sql

我有两个表,message_threadsmessages。当返回 message_threads 的结果集时,我在两个表上执行 JOIN 以查看是否有来自发件人(到receiver) 在那个线程中是未读的。

下面是我的 SQL...

SELECT mt.id AS thread_id, m.id AS message_id,
m.is_read, m.from_type, mt.company_id
FROM message_threads AS mt
LEFT JOIN messages AS m
ON m.thread_id = mt.id;

...给定查询的完整结果集...

+-----------+------------+---------+-----------+------------+
| thread_id | message_id | is_read | from_type | company_id |
+-----------+------------+---------+-----------+------------+
|         1 |          1 | N       | company   |          1 |
|         1 |          9 | N       | company   |          1 |
|         1 |         19 | N       | company   |          1 |
|         2 |          2 | Y       | coder     |          1 |
|         2 |          3 | N       | company   |          1 |
|         2 |          6 | N       | company   |          1 |
|         2 |          8 | N       | company   |          1 |
|         3 |          4 | N       | company   |          1 |
|         6 |         13 | N       | company   |          1 |
|         6 |         14 | N       | coder     |          1 |
|         6 |         15 | N       | company   |          1 |
|         8 |         20 | N       | company   |          1 |
|         8 |         21 | N       | coder     |          1 |
|         4 |          5 | N       | company   |          2 |
|         4 |          7 | N       | company   |          2 |
|         4 |         22 | N       | coder     |          2 |
|         5 |         10 | N       | company   |          8 |
|         5 |         11 | N       | coder     |          8 |
|         5 |         12 | N       | company   |          8 |
|         7 |         16 | N       | company   |         18 |
|         7 |         17 | N       | coder     |         18 |
|         7 |         18 | N       | company   |         18 |
+-----------+------------+---------+-----------+------------+

...和所需的结果集:

+-----------+------------+---------+-----------+------------+
| thread_id | message_id | is_read | from_type | company_id |
+-----------+------------+---------+-----------+------------+
|         1 |         19 | N       | company   |          1 |
|         2 |          2 | Y       | coder     |          1 |
|         3 |          4 | N       | company   |          1 |
|         6 |         14 | N       | coder     |          1 |
|         8 |         21 | N       | coder     |          1 |
|         4 |         22 | N       | coder     |          2 |
|         5 |         11 | N       | coder     |          8 |
|         7 |         17 | N       | coder     |         18 |
+-----------+------------+---------+-----------+------------+

如何执行此查询?我试过 GROUP BYDISTINCT,但都没有达到我想要的效果。我也无法使用 WHERE 子句来过滤我的数据,因为无论 is_read 标志如何,我都需要所有线程。

谢谢!

最佳答案

有很多方法可以做到这一点。如果您希望查看线程中未读消息的数量,您可能需要加入内部查询。

例子:

SELECT 
mt.id AS thread_id, 
mt.company_id,
CASE WHEN m_c.m_unread IS NOT NULL THEN m_c.m_unread ELSE 0 END AS unread
FROM message_threads AS mt
LEFT JOIN 
( 
  SELECT
  thread_id,
  COUNT(*) AS m_unread
  FROM messages
  WHERE
  is_read ='N'
  GROUP BY 1
)m_c
ON mt.thread_id = m_c.thread_id 

关于mysql - 从消息线程中获取嵌套的未读消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8920577/

相关文章:

mysql - 使用 dotnet String.Format 将数据保存到数据库失败

SQL 自动增量 pgadmin 4

php - 设置 var mysql 并启动事务

PHP MYSQL - 不使用列名但使用自动增量字段插入

mysql - 自然连接有效但不适用于所有值

java - 使用 Apache Sqoop 将数据从 MySQL 导入到 MySQL

sql - 需要获取最小开始日期和最大结束日期,当月份没有休息时

mysql - 是否可以在带有 group by 子句的查询结果中指定代表组的行的选择?

sql - 如何将多个 parent 映射到单个 child 记录

php mysqli 插入不起作用