我的消息系统基于消息,线程和参与者
我收到了这个请求。它给出了用户收到的消息数(=用户不是创建者的消息数)
我计算在用户不是创建者的线程列表中创建的所有消息。 我通过查找我的用户参与者链接的所有thread_id获得了线程列表
SELECT COUNT(m.id)
FROM message m
INNER JOIN message_thread t ON m.thread_id = t.id
WHERE m.created_by_id != :userId
AND t.id IN (
SELECT t2.id
FROM message_thread t2
INNER JOIN message_participants p ON p.thread_id = t2.id
WHERE p.user_id = :userId
)
这适用于一个uniq用户。
+-------------+
| count(m.id) |
+-------------+
| 7 |
+-------------+
我正在尝试做同样的事情,但是对于几个用户,并为每个用户获取他们收到的消息数量
+---------+-------------+
| User id | count(m.id) |
+---------+-------------+
| 12645 | 1 |
| 985 | 5 |
| 8956 | 15 |
| 37856 | 2 |
+---------+-------------+
我尝试使用更多JOIN代替t.id IN (
并按结果分组,但没有成功......
答案 0 :(得分:1)
一种方法是强力方法,您可以引入所有您关心的用户并使用该信息进行处理:
SELECT p.userid,
COUNT(DISTINCT CASE m.created_by_id <> p.userId THEN m.id END) as numMessages
FROM message m INNER JOIN
message_thread t
ON m.thread_id = t.id INNER JOIN
message_participants p
ON p.thread_id = t.id
GROUP BY p.userid;
如果您想为所有用户执行此操作,我建议采用不同的方法:计算用户参与的所有消息,并减去他/她是创建者的消息:
NSMutableDictionary *userDefaults = (NSMutableDictionary*)[[NSUserDefaults standardUserDefaults] dictionaryRepresentation];
[userDefaults removeObjectForKey:@"XYZ"];
答案 1 :(得分:0)
您应该使用
组SELECT message_thread.your_user_id COUNT(m.id)
FROM message m
INNER JOIN message_thread t ON m.thread_id = t.id
WHERE m.created_by_id != :userId
AND t.id IN (
SELECT t2.id
FROM message_thread t2
INNER JOIN message_participants p ON p.thread_id = t2.id
)
group by message_thread.your_user_id