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

Posted

技术标签:

【中文标题】在codeigniter和mysql中过滤多个时间段的sql记录?【英文标题】:Filter sql records on multiple time periods in codeigniter and mysql? 【发布时间】:2017-10-30 10:48:32 【问题描述】:

表 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

表组_消息

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

【问题讨论】:

为什么不在join_time和left_time之间基于message_time在两个表之间进行连接(left_time到now()上有一个ifnull函数)? @SloanThrasher 感谢您的关注,但我有让 yser 可以多次离开和加入的功能,因此我们有多个用户时段,并且当 hi 不属于组时不会向他显示消息。例如,在这里我们可以看到用户在 2017-05-29 17:26:00 到 2017-05-29 19:00:00 和 2017-05-29 21:00:00 到 2017-05-29 之间不是组的一部分21:30:00。所以我们不必显示在此期间发送的消息 正是/这就是加入的作用。 @SloanThrasher 我听不懂你想说什么?你能解释一下吗? 编辑您的问题并显示表格架构。 【参考方案1】:

你没有注意到你正在使用的数据库,所以我为 SQL Server 提供了方法。想法是连接表并使用WHERE 子句检查message_time 是否在join_timeleft_time 之间。稍后检查left_time是否为NULL,这意味着用户仍然连接,因此您可以使用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()

【讨论】:

感谢您的关注,但我有让 yser 可以多次离开和加入的功能,因此我们有多个用户时段,并且当 hi 不属于组时不会向他显示消息。例如在这里我们可以看到用户在 2017-05-29 17:26:00 到 2017-05-29 19:00:00 和 2017-05-29 21:00:00 到 2017-05-29 之间不是组的一部分21:30:00。所以我们不必显示在此期间发送的消息 提供更多样本数据,进行测试。 我可以给你.sql文件吗?【参考方案2】:

我没有跟上 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

【讨论】:

我尝试过这个,但这在特定用户的剩余时间或加入时间上不起作用 肯定会的。它应该返回每行 group_users 中的时间段内的所有消息。

以上是关于在codeigniter和mysql中过滤多个时间段的sql记录?的主要内容,如果未能解决你的问题,请参考以下文章

在codeigniter查询生成器中使用union,并在虚拟mysql列中进行过滤

如何使用codeigniter从mysql中获取多个多维数组中的数据?

一次运行多个mysql命令而不是在codeigniter中顺序运行?

如何使用 CodeIgniter 在数据库中插入多个值?

CodeIgniter - 使用事务插入多个表

在codeigniter中多次进入mysql时获取最后插入的'Id'