0

イベントの日付として、date_of という列に異なる数の値を格納する必要があります。10 月 1 日、2 日、6 日など、複数の日付が発生する可能性があります。そして、それを 3 つの異なる日付としてその列に格納する必要があります。今、私はこれを次のようにします:

1350619200, 1350705600, 1350792000

だから私ができるようにしたいのは、mysqlの結果を日付で並べ替えることです。最初の日付は注文される日付である必要がありますが、上記のように複数の日付がある場合、日付が過ぎた場合は 2 番目の日付、次に 3 番目の日付などに移動する必要があります。

これをどのように開始すればよいかわかりません。私の主な優先事項は、配列の最初の日付で結果を並べることです。私の質問の他の部分はそれほど重要ではありません。

4

2 に答える 2

3

常に設定されている最初のフィールドで並べ替える場合は、フィールドの抽出を試すことができます。

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

実際にはdate_of、辞書順が維持されているため、 で並べることができます。最後のサブフィールドで注文すると困りますが、最初のサブフィールドが欲しいので...

「日付の最初の要素が過去の場合」は少し注意が必要です。

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

開始することができますが、2 番目のサブフィールドがない場合はどうなりますか? 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

この構造からは素晴らしいパフォーマンスが得られないことがわかります。3 つの異なる列に 3 つの日付を入れるか、別のテーブルに日付を入れるようにモデルを再設計することを強くお勧めします。

于 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 に答える