mysql – 如何返回按实体分组的最近时隙,但只返回最近的可用日期,而不是每个可用日期?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了mysql – 如何返回按实体分组的最近时隙,但只返回最近的可用日期,而不是每个可用日期?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2479字,纯文字阅读大概需要4分钟。
内容图文
我有一个表,可以按小时为教师存储可用的约会,每个教师每天可以自由添加无限的插槽(只要插槽不重叠).示例简化结构:
CREATE TABLE time_slots (
id int(10) unsigned NOT NULL AUTO_INCREMENT,
teacher_id mediumint(8) unsigned NOT NULL,
slot bigint(20) unsigned NOT NULL DEFAULT '0',
);
slot列存储槽的时间戳.
如何为每位教师显示第一个最近可用日期的所有可用插槽?
注意:显示给定日期的所有时段,并且不能为同一位教师显示超过一天的时间.
示例数据:
PS:使用datetime只是为了让事情更具可读性.
+----+------------+------------------+
| id | teacher_id | slot |
+----+------------+------------------+
| 1 | 1 | 2013-04-10 08:00 |
| 2 | 1 | 2013-04-10 09:00 |
| 3 | 1 | 2013-04-10 09:30 |
| 4 | 1 | 2013-04-11 08:00 |
| 5 | 1 | 2013-04-11 09:00 |
| 6 | 1 | 2013-04-11 10:30 |
| 7 | 2 | 2013-04-12 07:00 |
| 8 | 2 | 2013-04-12 09:00 |
| 9 | 2 | 2013-04-14 08:00 |
+----+------------+------------------+
预期结果:
假设搜索时间:2013-04-10 08:30,返回的结果必须是:
+----+------------+------------------+
| id | teacher_id | slot |
+----+------------+------------------+
| 2 | 1 | 2013-04-10 09:00 |
| 3 | 1 | 2013-04-10 09:30 |
| 7 | 2 | 2013-04-12 07:00 |
| 8 | 2 | 2013-04-12 09:00 |
+----+------------+------------------+
>不要显示id 1,因为它已经从第10天/ 4月的08:00开始.
>不要显示id 4,5,6,因为我们发现teacher = 1的最近可用插槽是id的2和3.
>不要显示id 9,因为对于教师= 2,最近的可用插槽是7和8,所以不要再返回另一天.
我尝试了什么
我很难找到一个查询,我刚刚得到了这个基本查询,但它没有假设只获得第一天,当然它不会返回给定日期的所有可用插槽.每个教师只返回1个插槽:
SELECT id, teacher_id, FROM_UNIXTIME(slot)
FROM time_slots
WHERE slot >= [Actual timestamp]
GROUP BY DATE(FROM_UNIXTIME(slot))
ORDER BY slot, teacher_id ASC
注意:我在这里使用FROM_UNIXTIME只是为了调试,当然我稍后会优化索引等.
解决方法:
首先,您需要一个查询来获得每位教师最近的一天,因为每个教师都会有不同的一天.一些假的SQL在这里这样做:
SELECT
MIN(DATE(slot)) as closestDay,
teacher_id
FROM time_slots
WHERE slot >= NOW()
GROUP BY teacher_id
然后获取该查询并使用结果显示每天的所有可用插槽
SELECT
id,
time_slots.teacher_id,
FROM_UNIXTIMESTAMP(slot)
FROM time_slots
JOIN (
SELECT
MIN(DATE(slot)) as closestDay,
teacher_id
FROM time_slots
WHERE slot >= NOW()
GROUP BY teacher_id
) a
ON a.teacher_id = time_slots.teacher_id
AND DATE(time_slots.slot) = closestDay
WHERE time_slots.slot >= NOW()
它显然没有经过测试,但它应该给你一般的想法.
内容总结
以上是互联网集市为您收集整理的mysql – 如何返回按实体分组的最近时隙,但只返回最近的可用日期,而不是每个可用日期?全部内容,希望文章能够帮你解决mysql – 如何返回按实体分组的最近时隙,但只返回最近的可用日期,而不是每个可用日期?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。