我有一个预订系统,它通过在一个表中每行存储一个预留而开始。以下是架构的简要概述:
reservation_id unsigned int auto_increment,
status enum('pending', 'accepted', 'cancelled', 'rejected')
check_in datetime,
check_out datetime
在管理员控制面板中,可以逐页查看预订 - 一切都很顺利。但是,客户希望对每个预订都有修改请求(即他们的客户可以要求更改他们的预订日期,如果没有,那么他们的原始预订仍将保留)。
架构更改为:
reservation_id unsigned int auto_increment,
revision unsigned int,
status enum('pending', 'accepted', 'cancelled', 'rejected', 'replaced')
check_in datetime,
check_out datetime
现在,由于每个预留有1行或更多行,因此管理控制面板存在问题。数据库分页一次提取10行,但无法保证特定预留的所有修订都会在“下一页”中收集。
要想用数据来描绘这一点,想象一下每页“下一页”会分页3行:
reservation_id, revision
(1000, 1, 'accepted')
(1001, 1, 'replaced')
(1001, 2, 'replaced')
(1001, 3, 'accepted') <--- this one is cut from the result set
... since it spans a page boundary
由于原始代码假设每一行代表一次预订,因此不再有效。
请问解决这个问题的最佳方法是什么?是否有一个mysql查询将检索下一个N预订+修订。这是一个可变数量的行,具体取决于每次预订的修订次数。
答案 0 :(得分:1)
首先,我怀疑你的reservation_id在第二个例子中仍然是自动增量,因为它有多个具有相同reservation_id的行。
无论如何,您可以使用子查询解决此问题,如下所示:
select * from reservation R1
join (select distinct reservation_id
from reservation order by reservation_id limit 0,3) R2
on R1.reservation_id=R2.reservation_id
首先我想使用IN代替连接,但我的MySQL还不支持IN / ALL / ANY / SOME类型子查询中的LIMIT。
答案 1 :(得分:0)
如果我没错,你的revision
列只是一个递增的数字,不是吗?如何将预订与其修订相关联?
首先,我要添加parent_id
列(整数,可空),该列应填充链接预留,创建一对多关系;特定预订的所有修订都应在该字段中包含其ID。
然后我将执行两个不同的查询,一个用于获取所有预留(即null
列中parent_id
的所有行),另一个用于获取所有修订;我只会将分页应用于预订,因为它们是您的主要实体(预订是一个子实体,因为它不能在没有预订的情况下存在)。