0

Quassnoi の回答に続いて、彼のアドバイスを使用して何が起こるかを示すために編集し、問題のある順序を示すために OID に文字を追加しました。

データベースに追加する予定の日付で最初に注文したいテーブルが mysql データベースにあります。

SELECT * FROM table ORDER BY date_placed DESC;

次に、日付が同じ場合、自動インクリメントされた ID で注文したいと思います。だから私は追加しました:

SELECT * FROM table ORDER BY date_placed DESC, id DESC;

私はこのようなものになります:

Date_Placed | ID | OID | AB
2012 年 5 月 1 日 | 1100 | A50 | あ
2012 年 5 月 1 日 | 1109 | A50 | B
2012 年 5 月 1 日 | 1108 | B40 | あ
2012 年 5 月 1 日 | 1107 | B40 | B
2012 年 4 月 1 日 | 1106 | C30 | あ
2012 年 4 月 1 日 | 1105 | C30 | B

AB フィールドは常に A または B のみであり、OID は 2 回存在するか、一意の値である可能性があります。私が今欲しいのは、OID が重複している場合で、AB 列で B が A の前に来るようにすることです。ID がある程度乱れることに注意してください。

Date_Placed | ID | OID | AB
2012 年 5 月 1 日 | 1109 | A50 | B
2012 年 5 月 1 日 | 1110 | A50 | あ
2012 年 5 月 1 日 | 1107 | B40 | B
2012 年 5 月 1 日 | 1108 | B40 | あ
2012 年 4 月 1 日 | 1105 | C30 | B
2012 年 4 月 1 日 | 1106 | C30 | あ

かなりの数の行を取得するので、mysql 側でこれを行うことをお勧めします。これは可能ですか?mysql にない場合、私は php を使用しているので、その中でそれを行う最良の方法は何でしょうか? 助けていただける方に、事前に感謝します。

Quassnoi の答えは次のとおりです。

Date_Placed | ID | OID | AB
2012 年 5 月 1 日 | 1107 | B40 | B
2012 年 5 月 1 日 | 1108 | B40 | あ
2012 年 5 月 1 日 | 1109 | A50 | B
2012 年 5 月 1 日 | 1110 | A50 | あ
2012 年 4 月 1 日 | 1105 | C30 | B
2012 年 4 月 1 日 | 1106 | C30 | あ

ID の順序が失われます

4

1 に答える 1

2
SELECT  m.*
FROM    (
        SELECT  date_placed, oid, MAX(id) AS mid
        FROM    mytable
        GROUP BY
                date_placed, oid
        ) md
JOIN    mytable m
ON      (m.date_placed, m.oid) = (md.date_placed, md.oid)
ORDER BY
        m.date_placed DESC, mid DESC, ab DESC

2 つの条件が当てはまる場合:

  1. id単一内でoid連続している (それらの間にギャップがない)、および
  2. B常に順番に前Aに行き、id

これを使って:

SELECT  *
FROM    mytable
ORDER BY
        date_placed DESC,
        CASE ab WHEN 'A' THEN id - 1 ELSE id END DESC,
        id

、結合なし。

于 2012-06-07T13:32:28.117 に答える