【发布时间】:2015-02-07 13:56:01
【问题描述】:
我有一个超过 250k 行“名称”(和辅助信息)的表格,我正在使用 jQuery Datatables 显示它..
我的用户可以选择 any 'name' (Row) ,然后将其标记为 'taken'(并加盖时间戳)。
表格的一个(非常)精简版是:
密钥、名称、拍摄时间、时间戳
我希望能够首先显示“已采用”行(按时间戳顺序),然后按其键顺序 [ASC] 显示未采用的记录。
问题很简单,但是由于尺寸限制(视觉 UI 和数据集大小)我的显示机制分页 - 10 / 20 / 50 / 100 行(用户选择)
这意味着a)“采取”的总数会有所不同,b)分页长度会有所不同。
因此我看不到任何明显的方法来跟踪分页。
(我的数据表告诉我开始记录的计数和显示记录的长度)
我的 SQL (mySQL) 在这个级别很弱,我不知道如何返回一个记录集,该记录集解释了“采取”偏移量,而没有某种新的(或内部 mySQL)数字索引来分页。
我想到了:
- 使用键和新的数字索引创建一个临时表 每个分页。
- 创建一个触发器,当行被重新排序时 '采取'。
- 有一个“运行顺序”列在每个新的“采取”时更新
- 某种基于光标的程序(此时我的头发是 当解释直接从我的头顶飞过时,怒不可遏!)
似乎都过分了。
我还想过在 PHP 中进行大量操作(涉及单独的查询,取决于分页大小、已采用的名称数量,以及保持分页位置的运行记录。)
对于人机(大脑)来说,这个问题是不费吹灰之力的——但是把它翻译成 sql 让我很困惑,因为我想出了一个快速替代 1-3 的方法(更新“运行顺序”解决方案的测试用例几乎花了三分钟完成!)
“感觉”应该有一个智能的 SQL 查询答案来解决这个问题,但是除非我返回整个数据集并进行大量令人讨厌的计数,否则所有使用 ORDER BY、LIMITS 等的努力都会失败。
我想念房间里有没有像大大象一样的东西 - 还是我坚持不懈地努力才能得到我需要的东西。
谢谢
【问题讨论】:
标签: mysql mysqli indexing pagination subquery