Mysql 对于未读邮件计数,是否也应将其删除?“最近发送消息的时间”是什么?我的错,我不清楚:“count_thread_msgs”是线程中的消息总数,与发送消息的人无关count_unread_msg'是发送到特定用户id(to_usr_id)的未读邮件数。@Jo
Mysql 对于未读邮件计数,是否也应将其删除?“最近发送消息的时间”是什么?我的错,我不清楚:“count_thread_msgs”是线程中的消息总数,与发送消息的人无关count_unread_msg'是发送到特定用户id(to_usr_id)的未读邮件数。@Jo,mysql,Mysql,对于未读邮件计数,是否也应将其删除?“最近发送消息的时间”是什么?我的错,我不清楚:“count_thread_msgs”是线程中的消息总数,与发送消息的人无关count_unread_msg'是发送到特定用户id(to_usr_id)的未读邮件数。@Jonathan:即使用户不知道一条或多条邮件(即发件人和收件人),您确定要在线程中包含全部邮件吗?这会不会导致每个线程都显示给每个用户()?哪一条应该是所需结果集中的“最新消息”:线程中的最新消息,即使用户既不是发件人也不是收件人;他们收到的最新
对于未读邮件计数,是否也应将其删除?“最近发送消息的时间”是什么?我的错,我不清楚:“count_thread_msgs”是线程中的消息总数,与发送消息的人无关count_unread_msg'是发送到特定用户id(to_usr_id)的未读邮件数。@Jonathan:即使用户不知道一条或多条邮件(即发件人和收件人),您确定要在线程中包含全部邮件吗?这会不会导致每个线程都显示给每个用户()?哪一条应该是所需结果集中的“最新消息”:线程中的最新消息,即使用户既不是发件人也不是收件人;他们收到的最新消息;或者是他们通讯的最新消息?谢谢你的回答,查询在某些情况下是有效的,但我有几个问题:1)我得到的是每个线程的第一条消息,而不是最后一条。2) 我认为它可以获取所有系统消息,您可以添加另一个查询来获取特定用户的线程吗?(以便向用户显示其消息)。3) 我的数据库中有3个线程,但我得到了5行结果。这可能吗?我附上了两张截图,一张是用户信息表,另一张是结果:-
+--------------+ +---------------------+
| messages | | users |
+----+---------+ +---------------------+
| id | message | | id | username | ...
+----+---------+ +---------------------+
+------------------------------------------------------------------------------+
| users_messages |
+------------------------------------------------------------------------------+
| id | from_usr_id | to_usr_id | msg_id | thread_id | read | sent_at | read_at |
+------------------------------------------------------------------------------+
+----------------------------------------------------------------------------
| last_messages_by_conversation
+----------------------------------------------------------------------------
| message | from_username | sent_at | count_thread_msgs | count_unread_msg |
+----------------------------------------------------------------------------
select u.username,msg.message,m.sent_at,
(select count(*) from user_message where read=0 and to_usr_id=$$) as count_thread_msgs,
(select count(*) from user_message where to_usr_id= $$) as count_unread_msg
from users as u join user_messages as m
on u.id=m.id where u.id=$$
group by u.id;`
SELECT
users.id,
users.username,
user_messages.thread_id,
user_messages.unread ,
messages.message
FROM users
LEFT JOIN (SELECT
from_usr_id ,
msg_id,
count(thread_id)) as thread_id,
count(read_at) as unread
FROM user_messages)as user_messages on user_messages.from_usr_id = users.id
LEFT JOIN messages on messages.id = user_messages.msg_id
SELECT messages.message,
users.username AS from_username,
t.sent_at,
t.count_thread_msgs,
t.count_unread_msg
FROM users_messages NATURAL JOIN (
SELECT thread_id,
to_usr_id,
MAX(sent_at) AS sent_at,
COUNT(*) AS count_thread_msgs,
SUM(NOT read) AS count_unread_msg
FROM users_messages
WHERE to_usr_id = ?
GROUP BY thread_id
) t JOIN messages ON messages.id = users_messages.msg_id
JOIN users ON users.id = users_messages.from_usr_id
SELECT c.message,
d.username AS from_username,
b.sent_at,
a.count_thread_msgs,
a.count_unread_msg
FROM (
SELECT MAX(id) AS maxid,
COUNT(*) AS count_thread_msgs,
COUNT(CASE WHEN `read` = 0 AND <uid> = to_usr_id THEN 1 END) AS count_unread_msg
FROM users_messages
WHERE <uid> IN (from_usr_id, to_usr_id)
GROUP BY thread_id
) a
JOIN users_messages b ON a.maxid = b.id
JOIN messages c ON b.msg_id = c.id
JOIN users d ON b.from_usr_id = d.id
ORDER BY b.sent_at DESC
SELECT
m.message,
u.username from_username,
um1.sent_at,
um2.count_thread_msgs,
um2.count_unread_msg
FROM users_messages um1
JOIN (
SELECT
thread_id,
MAX(sent_at) sent_at,
COUNT(*) count_thread_msgs,
COUNT(IF(`read` = 1, `read`, NULL)) count_unread_msg
FROM users_messages GROUP BY thread_id) um2
ON um1.thread_id = um2.thread_id AND um1.sent_at = um2.sent_at
JOIN messages m
ON m.id = um1.msg_id
JOIN users u
ON u.id = um1.from_usr_id
-- WHERE u.id = 100 -- specify user id here