ALTER TABLE messages
ADD INDEX idx_from_to (from_user, to_user),
ADD INDEX idx_to_from (to_user, from_user);
您可能需要考虑这样一个事实,即给定用户的完整聊天列表是(from any user, to given user) UNION (to any user, from given user)。 考虑示例数据中的用户1,他向用户5、6和7发送了消息,但未收到任何消息。用户5向用户7发送了消息,并从用户1收到了消息。
SELECT COUNT(DISTINCT(from_user)) AS count, to_user
FROM messages
GROUP BY to_user
ORDER BY count ASC
SELECT COUNT(*) AS count, from_user AS user
FROM (
SELECT from_user, to_user FROM messages
UNION
SELECT to_user, from_user FROM messages
) t
GROUP BY from_user
ORDER BY count ASC;
2条答案
按热度按时间6kkfgxo01#
我想你的问题可以用下面的代码来解决:
xoefb8l82#
请确保在两个方向上索引交叉点,否则它稍后将BYITA!
您可能需要考虑这样一个事实,即给定用户的完整聊天列表是
(from any user, to given user) UNION (to any user, from given user)
。考虑示例数据中的用户1,他向用户5、6和7发送了消息,但未收到任何消息。用户5向用户7发送了消息,并从用户1收到了消息。
返回以下内容(与您的问题中详细说明的预期结果匹配,错误除外)
| 计数|至_用户|
| - ------|- ------|
| 1个|五个|
| 1个|六个|
| 第二章|七|
反之
退货
| 计数|用户|
| - ------|- ------|
| 1个|六个|
| 第二章|五个|
| 第二章|七|
| 三个|1个|