0

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

1350619200, 1350705600, 1350792000

所以我想要做的是按日期订购mysql结果。第一个日期应该是它被订购的那个日期,但是如果有多个日期,如上所示,如果日期已过,那么它应该转到第二个日期,然后是第三个日期等等。

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

4

2 回答 2

3

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

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

实际上,您可以 order by date_of,因为字典顺序得到维护。如果你想按最后一个子字段排序,你会遇到麻烦,但既然你想要第一个......

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

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

我可以看到这种结构没有出色的表现。我强烈建议将三个日期放在三个不同的列中,或者重新设计模型以将日期放在单独的表中。

于 2012-09-23T23:10:42.183 回答
1

如果将其存储为字符串 ( VARCHAR),则只需ORDER BY对查询执行 a 即可。MySQL 将对字符串进行字典排序。如果您正在存储 unix 时间戳(您似乎是),那么这将工作到 2286 年 11 月 20 日下午 5:46:40 UTC。

它之所以有效,是因为所有时间戳都可能具有相同的长度,即 10 位数字。您只需要确保列表的格式保持一致。我会去<number>,<number,...没有空间。

于 2012-09-23T23:12:48.873 回答