在codeigniter和mysql中过滤多个时间段的sql记录?

时间:2017-05-30 05:30:39

标签: php mysql sql oracle codeigniter

表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();

2 个答案:

答案 0 :(得分:0)

你没有看过你正在使用的数据库,所以我已经为SQL Server提供了方法。想法是连接表并使用WHERE子句检查message_timejoin_time之间是否left_time。稍后检查left_timeNULL,这意味着用户仍然已关联,因此您可以使用COALESCENULL转换为当前时间。

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