Mysql,SELECT仅限可用公司,并按一个或多个日期时间范围排除其余公司(当它们不起作用时)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Mysql,SELECT仅限可用公司,并按一个或多个日期时间范围排除其余公司(当它们不起作用时),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1985字,纯文字阅读大概需要3分钟。
内容图文
![Mysql,SELECT仅限可用公司,并按一个或多个日期时间范围排除其余公司(当它们不起作用时)](/upload/InfoBanner/zyjiaocheng/898/4869fe9dfc41415a858dac3e3e7f39f6.jpg)
我需要改进我的项目的搜索引擎.
总体思路:这是一个客户可以找到易于使用的清洁公司的系统.
>表“客户端” – 包含所有客户端的常规表
>表“公司” – 与所有清洁公司的一般表
>表“日历” – 这里所有公司都可以在不接受客户请求时指定一个或多个不同的DATETIME范围
这是mysql表
http://sqlfiddle.com/#!9/5c7034/1
该系统拥有近10000个客户和约500家公司.
默认情况下,所有公司始终可用于客户请求.这就是为什么我们使用这个日历,公司可以禁用(将日期时间范围放在“不工作”),如果公司已经指定他们的服务在选择日期时关闭,客户将无法提出请求期间由客户.
如果客户需要2017-10-24 12:00:00(2小时)的清洁服务
1.他选择日期:2017-10-24,开始时间12:00:00
2.他规定持续时间:2小时
3.系统必须找到2017-10-24 12:00:00和2017-10-24 14:00:00之间可用的所有公司.
如您现在可以在表“日历”中看到示例数据,唯一可用的结果应该是公司2,因为它们正在客户选择的日期(2017-10-24 12:00:00).
我的问题是我被迫:
>查找2017-10-24 12:00:00和2017-10-24 14:00:00之间无法接受客户请求的所有公司
>使用NOT IN where子句的第一个查询的结果,最后找到可用的公司.
SELECT * FROM companies WHERE companies.company_id NOT IN ( **SELECT calendar.company_id FROM calendar WHERE calendar.not_available_from = '2017-10-24 12:00:00' OR calendar.not_available_from = '2017-10-24 14:00:00'** );
那么,有没有更好的方法来找到这些可用的公司?
现在所有的公司都在不断修改他们的封闭(不工作)日期时间范围,这个表日历很大,但没有这个表我不能排除那些无法处理客户请求的公司.
关于当前逻辑的任何建议都是非常受欢迎的.
需要保留的必要条件:默认情况下,所有公司都可以为客户提供服务,这就是为什么他们需要手动在不想工作时保持最新状态的原因.
其他一切都可以修改……
谢谢!
解决方法:
如果我理解正确,你可以这样做:
SELECT c.*
FROM companies c
WHERE NOT EXISTS (SELECT 1
FROM calendar ca
WHERE ca.company_id = c.company_id AND
ca.not_available_to >= '2017-10-24 12:00:00' AND
ca.not_available_from <= '2017-10-24 14:00:00'
);
这是实现重叠的正确方法.以上假设终点是包容性的.因此,如果无法使用的期限在2017-10-24 12:00:00结束,则公司将被过滤掉.改变< =到<和> =到>专属范围.
为了提高性能,您需要日历上的索引(company_id,not_available_to,not_available_from).
内容总结
以上是互联网集市为您收集整理的Mysql,SELECT仅限可用公司,并按一个或多个日期时间范围排除其余公司(当它们不起作用时)全部内容,希望文章能够帮你解决Mysql,SELECT仅限可用公司,并按一个或多个日期时间范围排除其余公司(当它们不起作用时)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。