我有两个表,message_threads
和 messages
。当返回 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 BY
和 DISTINCT
,但都没有达到我想要的效果。我也无法使用 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/