【问题标题】:Order by then select incrementallymysql:按顺序依次选择(分页)
【发布时间】:2015-02-07 13:56:01
【问题描述】:

我有一个超过 250k 行“名称”(和辅助信息)的表格,我正在使用 jQuery Datatables 显示它..

我的用户可以选择 any 'name' (Row) ,然后将其标记为 'taken'(并加盖时间戳)。

表格的一个(非常)精简版是:

密钥、名称、拍摄时间、时间戳

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

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

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

因此我看不到任何明显的方法来跟踪分页。

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

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

我想到了:

  1. 使用键和新的数字索引创建一个临时表 每个分页。
  2. 创建一个触发器,当行被重新排序时 '采取'。
  3. 有一个“运行顺序”列在每个新的“采取”时更新
  4. 某种基于光标的程序(此时我的头发是 当解释直接从我的头顶飞过时,怒不可遏!)

似乎都过分了。

我还想过在 PHP 中进行大量操作(涉及单独的查询,取决于分页大小、已采用的名称数量,以及保持分页位置的运行记录。)

对于人机(大脑)来说,这个问题是不费吹灰之力的——但是把它翻译成 sql 让我很困惑,因为我想出了一个快速替代 1-3 的方法(更新“运行顺序”解决方案的测试用例几乎花了三分钟完成!)

“感觉”应该有一个智能的 SQL 查询答案来解决这个问题,但是除非我返回整个数据集并进行大量令人讨厌的计数,否则所有使用 ORDER BY、LIMITS 等的努力都会失败。

我想念房间里有没有像大大象一样的东西 - 还是我坚持不懈地努力才能得到我需要的东西。

谢谢

【问题讨论】:

    标签: mysql mysqli indexing pagination subquery


    【解决方案1】:

    首先显示“已采用”行(按时间戳顺序)然后按其键顺序 [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,Timestamp,Key) 上的条件以匹配您存储在taken 列中的值。我假设您在“占用”行时存储1,否则存储0

    【讨论】:

    • 谢谢 - 我会去试试这个,我从没想过在 Order By 子句中使用 IF :看起来大象可能已经被发现了!
    • 我羞愧地低下了头:“采取的”状态是由(采取的不是空的&&采取的'')...即它之前是空/空字符串,我已经使用它用于存储用户 ID,因为他们可以尽可能频繁地“获取”......懒惰和应受谴责,抱歉
    • 如果taken 可以是NULL 那么ORDER BY IF(taken IS NULL, 0, 1) DESC, IF(taken IS NULL, Timestamp, Key) ASC :-)
    • 设置规则并一致地应用它:对于未采取的项目,将taken设置为NULL或空字符串或0(如果您将userId存储在taken中以标记项目),但不要混合它们。这包括该字段的默认值(我认为应该“不采用”)。
    • Re:“设置规则并始终如一地应用它”是的,我知道它不好,你完全正确 :-( 不幸的是,我没有完全控制在表中添加/编辑的数据, 和 others 没有那么严格,所以我必须考虑这两者。由于编辑和添加 很少见(ish),它的手动编辑而不是我编写 CMS .. ...我可能会按照您的建议对 Null 空字符串进行一些调整。
    猜你喜欢
    • 2020-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-13
    • 2017-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多