我正在创建一个小型聊天/消息系统。我有四个表:thread,thread_participant,message和message_read_state。我知道这可能不是最好的解决方案,但我只是想为我的项目付出代价。如何在不选择他/她自己的消息的情况下为特定用户选择所有新消息?
id
----------
1
2
thread_id user_id
---------- --------
1 6
1 7
id thread_id send_date message sending_user_id
---------- -------- -------- -------- --------
1 1 2016-05-12 HELLO 7
2 1 2016-05-12 HELLO BACK 6
message_id user_id s read_date
----- -------- --------
1 6 2016-05-12
2 7 2016-05-12
到目前为止我有什么。这会选择我参与过的所有主题,但我想只显示收到的消息,而不是我的回复。
SELECT message.id, message.send_date, message.message, tbl_users.user_id, message.thread_id
, (SELECT message_read_state.read_date
FROM message_read_state
WHERE message_read_state.message_id = message.id
and message_read_state.user_id = 6) AS ReadState
FROM message INNER JOIN tbl_users ON message.sending_user_id = tbl_users.user_id
WHERE ( message.id in
( SELECT (message.id)
FROM thread_participant INNER JOIN message
ON thread_participant.thread_id = message.thread_id
WHERE thread_participant.user_id = 6
GROUP BY thread_participant.user_id
)
)
ORDER BY message.send_date ASC;
答案 0 :(得分:1)
这个怎么样;)
SELECT message.id, message.send_date, message.message, tbl_users.user_id, message.thread_id
, (SELECT message_read_state.read_date
FROM message_read_state
WHERE message_read_state.message_id = message.id
and message_read_state.user_id = 6) AS ReadState
FROM message INNER JOIN tbl_users ON message.sending_user_id = tbl_users.user_id
WHERE ( message.id in
( SELECT (message.id)
FROM thread_participant INNER JOIN message
ON thread_participant.thread_id = message.thread_id
WHERE thread_participant.user_id = 6
GROUP BY thread_participant.user_id
)
)
AND message.sending_user_id <> 6
ORDER BY message.send_date ASC;
我只是在原始sql中添加AND message.sending_user_id <> 6
。如果你不想要回复,那就让sending_user_id
不是你,那么你得到你想要的。 :d