表Group_Users
id | user_id | join_time | left_time
-----------------------------------------------
1 | 123 | 2017-05-29 15:26:00 | 2017-05-29 17:26:00
2 | 123 | 2017-05-29 19:00:00 | 2017-05-29 21:00:00
3 | 123 | 2017-05-29 21:30:00 | NULL
表Group_Message
id | Message | sender_id | message_time
1 | Hii | 456 | 2017-05-29 15:30:00
2 | tes | 123 | 2017-05-29 18:30:00
3 | why | 852 | 2017-05-29 22:30:00
我有群组留言等功能。用户可以离开或加入的地方 组。
每当他离开或加入群组时,他的活动都存储在Group_Users中 表
当用户发送消息时,它随时间存储在Group_Message中。
我有其他字段,如group_id,但我在这里删除它 简单。
我希望当用户加入群组时,只显示他的消息 在他加入的时期。
例如。 当用户123在那时加入群组时,他只看到消息1,3。
在2条消息时,他不是小组成员。
这是我之前使用的旧查询,当用户无法重新加入时 离开小组后,他可以看到旧消息
$this->db->select('gm.*');
$this->db->from('group_message gm');
$this->db->where('gm.group_id',$id);
$this->db->where('gm.id NOT IN (select message_id from delete_group_message where user_id = '.$user_id.')',NULL,FALSE);
$this->db->where('gm.time >= (select join_time from group_users where user_id = '.$user_id.')',NULL,FALSE);
$this->db->where('gm.time <= (select left_time from group_users where user_id = '.$user_id.')',NULL,FALSE);
$this->db->order_by('time','DESC');
$query = $this->db->get();
$res = $query->result_array();
答案 0 :(得分:0)
你没有看过你正在使用的数据库,所以我已经为SQL Server提供了方法。想法是连接表并使用WHERE
子句检查message_time
和join_time
之间是否left_time
。稍后检查left_time
是NULL
,这意味着用户仍然已关联,因此您可以使用COALESCE
将NULL
转换为当前时间。
SELECT m.Id, m.Message
FROM users AS u
JOIN messages AS m ON u.Id = m.Id
WHERE m.message_time BETWEEN u.join_time AND COALESCE(u.left_time, GETDATE())
对于MySQL,您可以使用NOW()
代替GETDATE()
。
答案 1 :(得分:0)
我不能快速使用codeigniter,但这里的SQL应该返回你想要的内容:
SELECT gm.*
FROM group_message gm
JOIN group_users gu
ON gm.time between gu.join_time and gu.left_time
WHERE user_id = $user_id
ORDER BY gm.time DESC