2012-08-07 58 views
0

我的表包括记录,其中每条记录都有自己的历史,看起来像这样:排序MySQL表

65465406540-245|65465408540-654 

没有限制历史条目数(字段类型是文本,所以.. )。历史记录始终按照最旧到最新排序。这意味着最新的条目在右边。

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

现在我的问题是我想根据最近(或最早)的历史记录对表格中的记录进行排序。我会怎么做?

我在想MySQL的功能,因为结果必须来到我的PHP脚本已经排序,但我不知道从哪里开始,所以每个帮助都非常感谢。

回答

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通过串并以由最后订购item:

65465408540-654 

但是,这很可怕。如果可能的话,我会考虑用PHP来做这件事。

+0

我可能会描述它是错误的。我需要的是按照最后一个时间戳(asc/desc)排序。为了解决这个问题,我非常感谢@Jim复杂的查询,我只是添加了ASC或DESC。谢谢! – meridius 2012-08-07 20:39:52

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