MySQL查询用户列表中的用户

时间:2016-06-30 13:41:39

标签: mysql sql

我的消息系统基于消息,线程和参与者

  • 用户创建的消息链接到线程
  • 两个参与者(或更多)被链接到一个帖子
  • 每个参与者都链接到一个用户

我收到了这个请求。它给出了用户收到的消息数(=用户不是创建者的消息数)

我计算在用户不是创建者的线程列表中创建的所有消息。 我通过查找我的用户参与者链接的所有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 (并按结果分组,但没有成功......

2 个答案:

答案 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