这似乎是一个常见问题,但我一直在网上搜索但找不到答案。
我想保留一些东西几天(没有部分天数),所以我想我需要一张像这样的 table :
CREATE TABLE reservations
(
item int,
customer int,
startDate date,
endDate date
);
(嗯,我的主键是什么?item 和 startDate?我什至需要 PK 吗?)
但我的主要问题是如何在给定开始和结束日期的情况下找到免费项目。我的 SELECT ... 是什么样子的?
对于奖励分数,我们是否可以假设所有项目都是相同的,并且我希望尽可能提高效率,这样如果我想从星期五开始预订,我更愿意找到一个保留到星期四的项目(并且,因此从周五开始免费)。
对于双倍奖励标记,如果我需要 X 天的元素,我想在尽可能接近 X 天的预订中找到有漏洞的元素。
我认为问题在于我正在尝试查找不存在的内容(现有预订)。我发现的所有其他解决方案似乎都有一个可预订日期表和一个项目 ID(值为 NULL、0 或 -1 表示“尚未预订”)。这对我来说似乎效率低下。这张 table 会延伸到多远的 future ?
注意:有些人问的是读写比。显然,每次预订只进行一次,所以这是一次写入(可能每天一次,具体取决于实现方式),我希望在用户搜索未预订的时段时进行多次读取。
最佳答案
SELECT item FROM reservations WHERE
(endDate BETWEEN start AND end) OR (startDate BETWEEN start AND end) OR (startDate<start AND endDate>end)
根据@Strawberry 的建议,更好的查询将如下所示
SELECT item FROM reservations WHERE
start<endDate AND end>startDate
这将为您提供在您正在寻找的日子里拍摄的元素。 现在您需要查找不在此列表中的项目。所以如果你有一个包含项目的表你可以这样写
SELECT * FROM items WHERE item NOT IN
SELECT item FROM reservations WHERE
start<endDate AND end>startDate)
并且您会得到在您搜索期间免费的元素。
start, end 是日期你找 startDate, endDate 是列。
SELECT item, start-r.startDate as diff FROM items as i
LEFT JOIN reservations as r USING(item)
WHERE i.item NOT IN
(SELECT item FROM reservations WHERE
start<endDate AND end>startDate
) ORDER BY diff
没有模式来测试它,但这个查询应该是你的第一笔奖金的答案
至于第二个,这需要在一个表的行之间做一些数学运算,我现在想不出如果可能的话如何在纯 MySQL 中做这件事。
//编辑
当现有预订在搜索时间段之前开始并在搜索时间段之后结束时,我用另一个条件更新了查询。
对于第二个奖励问题,这应该有效
SELECT item, r1.startDate-r2.endDate as diff FROM reservations as r1 JOIN (SELECT * FROM reservations) as r2 USING (item)
WHERE r1.startDate-r2endDate>=x AND item NOT IN
(SELECT item FROM reservations WHERE
r1.startDate<endDate AND r2.endDate>startDate)
ORDER BY diff ASC
但这将是非常昂贵的查询。可能需要从子查询中的日期中添加/减去一天。
正如您在所有这些查询中看到的那样,我从帖子的开头开始使用查询作为子查询,对于第一个和第二个查询,这不会是一个大问题,因为它只会执行一次。在第二个奖金的最后一个查询中,它必须对每一行单独执行(因为每个项目都有一个连接,给定项目的预订数量为 2 的幂),这可能是一个瓶颈。
我不知道您要保留的那些项目是什么,但如果它们不多 <1000,它可能足够快(每年最多 365000="" 行),但如果项目数量真的很大也许你可以做出额外的条件来寻找="" future="">1000,它可能足够快(每年最多>
关于mysql - 预订系统的核心——高效查找未预订商品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15939399/
我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or
我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s
电脑0x0000001A蓝屏错误怎么U盘重装系统教学分享。有用户电脑开机之后遇到了系统蓝屏的情况。系统蓝屏问题很多时候都是系统bug,只有通过重装系统来进行解决。那么蓝屏问题如何通过U盘重装新系统来解决呢?来看看以下的详细操作方法教学吧。 准备工作: 1、U盘一个(尽量使用8G以上的U盘)。 2、一台正常联网可使用的电脑。 3、ghost或ISO系统镜像文件(Win10系统下载_Win10专业版_windows10正式版下载-系统之家)。 4、在本页面下载U盘启动盘制作工具:系统之家U盘启动工具。 U盘启动盘制作步骤: 注意:制作期间,U盘会被格式化,因此U盘中的重要文件请注
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt
文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co
需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc
我有一个应用需要发送用户事件邀请。当用户邀请friend(用户)参加事件时,如果尚不存在将用户连接到该事件的新记录,则会创建该记录。我的模型由用户、事件和events_user组成。classEventdefinvite(user_id,*args)user_id.eachdo|u|e=EventsUser.find_or_create_by_event_id_and_user_id(self.id,u)e.save!endendend用法Event.first.invite([1,2,3])我不认为以上是完成我的任务的最有效方法。我设想了一种方法,例如Model.find_or_cr
因为我现在正在做一些时间测量,我想知道是否可以在不使用Benchmark类或命令行实用程序time的情况下测量用户时间或系统时间。使用Time类只显示挂钟时间,而不显示系统和用户时间,但是我正在寻找具有相同灵active的解决方案,例如time=TimeUtility.now#somecodeuser,system,real=TimeUtility.now-time原因是我有点不喜欢Benchmark,因为它不能只返回数字(编辑:我错了-它可以。请参阅下面的答案。)。当然,我可以解析输出,但感觉不对。*NIX系统的time实用程序也应该可以解决我的问题,但我想知道是否已经在Ruby中实
我看到其他人也遇到过类似的问题,但没有一个解决方案对我有用。0.3.14gem与其他gem文件一起存在。我已经完全按照此处指示完成了所有操作:https://github.com/brianmario/mysql2.我仍然得到以下信息。我不知道为什么安装程序指示它找不到include目录,因为我已经检查过它存在。thread.h文件存在,但不在ruby目录中。相反,它在这里:C:\RailsInstaller\DevKit\lib\perl5\5.8\msys\CORE\我正在运行Windows7并尝试在Aptana3中构建我的Rails项目。我的Ruby是1.9.3。$gemin
在Ruby中,以毫秒为单位获取自纪元(1970)以来的当前系统时间的正确方法是什么?我试过了Time.now.to_i,好像不是我想要的结果。我需要结果显示毫秒并且使用long类型,而不是float或double。 最佳答案 (Time.now.to_f*1000).to_iTime.now.to_f显示包含十进制数字的时间。要获得毫秒数,只需将时间乘以1000。 关于ruby-以毫秒为单位获取当前系统时间,我们在StackOverflow上找到一个类似的问题: