代码之家  ›  专栏  ›  技术社区  ›  meridius

按复杂值排序mysql表

  •  0
  • meridius  · 技术社区  · 14 年前

    我的表由记录组成,其中每个记录都有自己的历史记录,如下所示:

    65465406540-245|65465408540-654
    

    历史记录条目计数没有限制(列类型是文本,所以…)。历史记录条目总是从最旧到最新排序。意味着最新的条目在右边。

    历史记录条目由管道字符“|”分隔。一个历史条目由时间戳、作为分隔符的短划线“-”和代表进行更改的用户ID的1-4位数字组成。

    现在我的问题是,我想按照最新(或最旧)的历史条目对表中的记录进行排序。我该怎么做?

    我在考虑MySQL函数,因为结果必须到我的PHP脚本已经排序,但我不知道从哪里开始,所以非常感谢每一个帮助。

    2 回复  |  直到 14 年前
        1
  •  1
  •   Jim    14 年前

    对于最旧的,您可以使用RedFilters(现在已编辑)的答案

    ORDER BY LEFT(column_name,11)
    

    按最新的订购更有意思。

    ORDER BY REVERSE(SUBSTR(REVERSE(column_name),1,LOCATE("|",REVERSE(column_name))-1))
    

    让我们把它分解一下。 我们反转列,找到第一个的索引|

    456-04580456456|542-04560456456  
    

    然后我们得到子串,直到这一点,这给出了:

    456-04580456456
    

    这是最后一个颠倒的项目,所以现在我们可以简单地 REVERSE 字符串,并按该字符串排序以按最后一项排序:

    65465408540-654
    

    然而,这是相当可怕的。如果可能的话,我会考虑用PHP来做这件事。

        2
  •  0
  •   meridius    14 年前

    我调整了Jim的查询,因此它也可以只使用一个或无历史记录条目,并且只显示时间戳,以便更容易地计算日期/时间。 它在这里:

    SELECT *, 
        IF(
            LOCATE('|', history) > 0, 
            LEFT(
                REVERSE(
                    LEFT(
                        REVERSE(history), 
                        LOCATE('|', REVERSE(history))-1
                    )
                ), 
                10
            ), 
            LEFT(history, 10)
        ) AS last 
    FROM table
    ORDER BY last DESC