从表{user}中存在user_id的表中选择all

时间:2016-05-13 07:57:40

标签: mysql

我正在创建一个小型聊天/消息系统。我有四个表:thread,thread_participant,message和message_read_state。我知道这可能不是最好的解决方案,但我只是想为我的项目付出代价。如何在不选择他/她自己的消息的情况下为特定用户选择所有新消息?

线程表

id
----------
1
2

thread_participant表

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_read_state

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;

1 个答案:

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