在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_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()
。
【讨论】:
感谢您的关注,但我有让 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中获取多个多维数组中的数据?