MySQL爆炸用于对结果进行排序的值数组

时间:2012-09-23 23:04:25

标签: php mysql database

我必须在名为date_of的列中为事件日期存储不同数量的值。可能会有多个日期,例如10月1日,2日和6日。我需要将该列存储为三个不同的日期。现在我这样做:

1350619200, 1350705600, 1350792000

所以我希望能够做的是按日期排序mysql结果。第一个日期应该是它所订购的日期,但如果有如上所示的多个日期,如果日期通过则应该转到第二个日期,然后是第三个日期等。

我不知道如何开始这个,我的主要优先事项是按照数组中的第一个日期排序结果,我问题的另一部分并不重要。

2 个答案:

答案 0 :(得分:3)

如果您按照始终设置的第一个字段进行排序,则可以尝试提取字段:

ORDER BY SUBSTRING_INDEX(date_of, ',', 1);

实际上,您可以按date_of订购,因为维护了词典顺序。如果你想通过 last 子字段订购,你会遇到麻烦,但是因为你想要第一个...

现在“如果日期的第一个元素过去了”有点棘手。

ORDER BY CASE WHEN SUBSTRING_INDEX(date_of, ',', 1) > UNIX_TIMESTAMP()
    THEN SUBSTRING_INDEX(date_of, ',', 1)
    ELSE ... END

可能是一个开始,但如果有没有第二个子字段?如果我们迭代SUBSTRING_INDEX,我们再次得到第一个字段。

您必须迭代CASE本身。 发抖

ORDER BY CASE WHEN SUBSTRING_INDEX(date_of, ',', 1) > UNIX_TIMESTAMP()
    THEN SUBSTRING_INDEX(date_of, ',', 1)
    ELSE
        CASE WHEN SUBSTRING_INDEX(SUBSTRING_INDEX(date_of, ',', 2),',',-1) > UNIX_TIMESTAMP()
        THEN SUBSTRING_INDEX(SUBSTRING_INDEX(date_of, ',', 2),',',-1)
        ELSE
            CASE WHEN SUBSTRING_INDEX(SUBSTRING_INDEX(date_of, ',', 3),',',-1) > UNIX_TIMESTAMP()
            THEN SUBSTRING_INDEX(SUBSTRING_INDEX(date_of, ',', 3),',',-1)
            ELSE 999999999
            END
        END
    END

我可以看到这个结构没有很好的表现。我会强烈建议将三个日期分为三个不同的列,或者模型重新设计为在一个单独的表中包含日期。

答案 1 :(得分:1)

如果您将其存储为字符串(VARCHAR),那么您只需对查询执行ORDER BY即可。 MySQL将对字符串进行词法排序。如果您正在存储unix时间戳(您看起来是这样),那么这将一直有效,直到2286年11月20日下午5:46:40 UTC。

它的工作原理是因为所有时间戳都可能是相同的长度,10位数。您只需确保保持列表格式一致。我会去<number>,<number,...没有空格。