mysql - 按顺序然后增量选择

标签 mysql indexing pagination subquery

我有一个包含超过 250k 行“名称”(和辅助信息)的表,我正在使用 jQuery 数据表显示该表。

我的用户可以选择任何“名称”(行),然后将其标记为“已采用”(并带有时间戳)。

该表的(非常)精简版本是:

key 、名称、拍摄时间、时间戳

我希望能够首先显示“已采取”的行(按时间戳顺序),然​​后按其键顺序 [ASC] 显示未采取的记录。

问题很简单,但是,由于大小限制(视觉 UI 和数据集大小),我的显示机制分页 - 10/20/50/100 行(用户选择)

这意味着 a)“已采取”的总数会有所不同,b) 分页长度会有所不同。

因此我看不出有明显的方法来跟踪分页。

(我的数据表告诉我起始记录的计数和显示记录的长度)

我的 SQL (MySQL) 在这个级别很弱,我不知道如何返回一个记录集,该记录集说明了“采取的”偏移量,而没有某种新的(或内部 MySQL)数字索引来分页。

我想到的是:

  1. 使用键和新的数字索引创建临时表 每个分页。

  2. 创建一个触发器,当行被删除时对表重新排序 “已采取”。

  3. 拥有一个“运行订单”列,该列会在每次新“采取”时更新

  4. 某种基于光标的程序(此时我的头发是 当这些解释直接从我的头顶飞过时,我感到很愤怒!)

一切似乎都太过分了。

我还考虑在 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/

相关文章:

mySQL:寻找事务表中每日统计的查询/sql解决方案

python - Pandas:删除带有某些日期的字符串

python-3.x - 获取每个 id 的所有列,其中该列等于某个值

php - 分页之前的多维 groupBy 和 orderBy - Laravel 5

java - JSP中IF语句执行错误

mysql - 为什么在 MAC OSX 上编译简单的 mysql c 应用程序时不断收到 undefined symbol ?

php - mysql 从获取的id中选择id并进行增量操作

python - 索引错误: string index out of range python

javascript - .Net Core PartialView 中的分页

zend-framework - 如何在zend框架中对两个表进行分页