【发布时间】:2018-05-09 11:42:12
【问题描述】:
我有一个系统通过向外部系统发送 3 个参数来请求信息:用户、开始日期和结束日期。
我有一张桌子
request (
id,
user,
start_date,
end_date,
status
)
记录这些请求及其状态(Done 用于已返回的请求,Waiting 用于尚未返回的请求)。
每隔几个小时,我会重新提交尚未返回的请求,即使最初的请求在未来一段时间内仍可能返回。
一段时间后,我的表将对同一个用户/开始日期/结束日期有多个请求,其中一些正在等待,一些已完成。
我需要的是一个查询,它返回所有重复请求的 id 列表,但 1 Done 除外,其中至少一个请求的状态=Done。
总之,我需要一种方法来清除给定用户/开始日期/结束日期的超出请求,如果其中至少有一个状态=完成(不管哪个,我只需要保持 1 个状态 = 完成)给定的用户/开始日期/结束日期)。
到目前为止,我已经能够查明至少完成 1 次的重复请求。要从此查询中选择除一个完整之外的所有查询,我很可能会将整个查询包装成另外 2 个选择并执行魔术,但是按原样查询已经很慢了。有人可以帮我重构它并选择我需要的最终结果吗?
http://sqlfiddle.com/#!5/10c25a/1
我正在使用 SQLite
sqlfiddle 中提供的数据集的预期结果是这样的:
454, 457, 603, (604 or 605 not both), 607, 608
【问题讨论】:
-
可以安全地假设具有最低
id的Done请求是要保留的吗? -
是否可以使用“Waiting”的
Status进行较早的请求,然后使用Status“Done”进行重复的请求? -
呃,为什么你有重复的
id值? -
样本数据和期望的结果真的很有帮助。
-
Phil 假设任何关于请求状态的顺序是不安全的,是的,它可能具有这种状态设置。我还修复了重复的 ID。 GordonLinoff 我刚刚将预期结果添加到问题中,并将示例数据添加到 sqlfiddle