0

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

65465406540-245|65465408540-654

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

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

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

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

4

2 回答 2

1

对于最古老的,您可以使用 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通过字符串和 order by 来对最后一项进行排序:

65465408540-654

然而,这非常可怕。如果可能的话,我会考虑在 PHP 中执行此操作。

于 2012-08-07T15:59:19.293 回答
0

我调整了 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
于 2012-08-10T13:22:30.600 回答