我有一个包含超过 250k 行“名称”(和辅助信息)的表,我正在使用 jQuery 数据表显示该表。
我的用户可以选择任何“名称”(行),然后将其标记为“已采用”(并带有时间戳)。
该表的(非常)精简版本是:
key 、名称、拍摄时间、时间戳
我希望能够首先显示“已采取”的行(按时间戳顺序),然后按其键顺序 [ASC] 显示未采取的记录。
问题很简单,但是,由于大小限制(视觉 UI 和数据集大小),我的显示机制分页 - 10/20/50/100 行(用户选择)
这意味着 a)“已采取”的总数会有所不同,b) 分页长度会有所不同。
因此我看不出有明显的方法来跟踪分页。
(我的数据表告诉我起始记录的计数和显示记录的长度)
我的 SQL (MySQL) 在这个级别很弱,我不知道如何返回一个记录集,该记录集说明了“采取的”偏移量,而没有某种新的(或内部 MySQL)数字索引来分页。
我想到的是:
使用键和新的数字索引创建临时表 每个分页。
创建一个触发器,当行被删除时对表重新排序 “已采取”。
拥有一个“运行订单”列,该列会在每次新“采取”时更新
某种基于光标的程序(此时我的头发是 当这些解释直接从我的头顶飞过时,我感到很愤怒!)
一切似乎都太过分了。
我还考虑在 PHP 中进行大量操作(涉及单独的查询,取决于分页大小、已采用的名称数量,并保留分页位置的运行记录。)
对于人机(大脑)来说,这个问题很轻松 - 但将其翻译成 SQL 让我很困惑,因为我想出了 1-3 的快速替代方案(更新“运行顺序”解决方案的测试用例几乎花了三分钟即可完成!)
“感觉”应该有一个智能 SQL 查询答案来解决这个问题,但是除非我返回整个数据集并进行大量令人讨厌的计数,否则所有有关 ORDER BY、LIMITS 等的努力都会失败。
我失踪的房间里是否有像一头大大象之类的东西 - 或者我是否一直在艰难地获取我需要的东西。
最佳答案
首先显示“已采取”行(按时间戳顺序),然后按关键顺序 [ASC] 显示未采取记录的查询:
SELECT *
FROM `table_name`
ORDER BY `taken` DESC, IF(`taken` = 1, `Timestamp`, `Key`) ASC
LIMIT 50, 10
LIMIT
值:10
是页面大小,50
是页面 6
上第一个元素的索引。
更改 IF(taken = 1,
上的条件时间戳,
key )
使用正确的条件来匹配您存储在列 taken
中的值。我假设你存储 1
当该行被“采取”并且 0
否则。
关于mysql - 按顺序然后增量选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27382932/