如何使用带分页的版本控制来检索MySQL表行

时间:2015-08-12 15:01:10

标签: mysql sql database database-design

我有一个预订系统,它通过在一个表中每行存储一个预留而开始。以下是架构的简要概述:

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预订+修订。这是一个可变数量的行,具体取决于每次预订的修订次数。

2 个答案:

答案 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的所有行),另一个用于获取所有修订;我只会将分页应用于预订,因为它们是您的主要实体(预订是一个子实体,因为它不能在没有预订的情况下存在)。