0

要件の変更により、数か月前に作成したインターフェイスを再検討しました。より多くの機能、より多くのデータ。ここでデータの複雑な順序付け要件についてサポートを受けました。しかし、要件は変更されました。より正確には、拡張されました。私は数時間いじくり回してきましたが、成功していません。SOがもう一度私をほぐすのを手伝ってくれることを願っています.

データベースに表示される単純化されたサンプル データと、それを注文する方法を次に示します。

                **未加工** **望ましい**

╔════╦════════╦═══════════╦═══════════╗╔════╦═════ ═══╦═══════════╦═══════════╗
║ id ║ job_id ║ action_id ║ 反復 ║ ║ id ║ job_id ║ action_id ║ 反復 ║
╠════╬════════╬═══════════╬═══════════╣╠════╬═════ ═══╬═══════════╬═══════════╣
║ 1 ║ 1 ║ 1 ║ 0 ║ ║ 14 ║ 6 ║ 1 ║ 0 ║
║ 2 ║ 1 ║ 2 ║ 0 ║ ║ 16 ║ 6 ║ 2 ║ 0 ║
║ 3 ║ 2 ║ 1 ║ 0 ║ ║ 12 ║ 1 ║ 1 ║ 1 ║
║ 4 ║ 3 ║ 1 ║ 0 ║ ║ 13 ║ 1 ║ 2 ║ 1 ║
║ 5 ║ 4 ║ 1 ║ 0 ║ ║ 15 ║ 1 ║ 3 ║ 1 ║
║ 6 ║ 3 ║ 2 ║ 0 ║ 8 ║ 5 ║ 1 ║ 0 ║
║ 7 ║ 3 ║ 3 ║ 0 ║ ║ 10 ║ 5 ║ 2 ║ 0 ║
║ 8 ║ 5 ║ 1 ║ 0 ║ ║ 11 ║ 5 ║ 3 ║ 0 ║
║ 9 ║ 4 ║ 2 ║ 0 ║ 5 ║ 4 ║ 1 ║ 0 ║
║ 10 ║ 5 ║ 2 ║ 0 ║ ║ 9 ║ 4 ║ 2 ║ 0 ║
║ 11 ║ 5 ║ 3 ║ 0 ║ ║ 4 ║ 3 ║ 1 ║ 0 ║
║ 12 ║ 1 ║ 1 ║ 1 ║ ║ 6 ║ 3 ║ 2 ║ 0 ║
║ 13 ║ 1 ║ 2 ║ 1 ║ 7 ║ 3 ║ 3 ║ 0 ║
║ 14 ║ 6 ║ 1 ║ 0 ║ ║ 3 ║ 2 ║ 1 ║ 0 ║
║ 15 ║ 1 ║ 3 ║ 1 ║ ║ 1 ║ 1 ║ 1 ║ 0 ║
║ 16 ║ 6 ║ 2 ║ 0 ║ ║ 2 ║ 1 ║ 2 ║ 0 ║
╚════╩════════╩═══════════╩═══════════╝╚════╩═════ ═══╩═══════════╩═══════════╝
                **説明済み**

╔════╦════════╦═══════════╦═══════════╗
║ id ║ job_id ║ action_id ║ 反復 ║
╠════╬════════╬═══════════╬═══════════╣
║ 14 ║ 6 ║ 1 ║ 0 ║
║ 16 ║ 6 ║ 2 ║ 0 ║ action_id が 1 の最大 ID
のすべての行が続く
║ 12 ║ 1 ║ 1 ║ 1 ║ 同じ job_id と反復回数
║ 13 ║ 1 ║ 2 ║ 1 ║ 1 番目、昇順
║ 15 ║ 1 ║ 3 ║ 1 ║ action_id。
╠════╬════════╬═══════════╬═══════════╣
║ 8 ║ 5 ║ 1 ║ 0 ║ 次に、
║ 10 ║ 5 ║ 2 ║ 0 ║ action_id = 1 など
║ 11 ║ 5 ║ 3 ║ 0 ║
╠════╬════════╬═══════════╬═══════════╣
║ 5 ║ 4 ║ 1 ║ 0 ║
║ 9 ║ 4 ║ 2 ║ 0 ║
╠════╬════════╬═══════════╬═══════════╣
║ 4 ║ 3 ║ 1 ║ 0 ║
║ 6 ║ 3 ║ 2 ║ 0 ║
║ 7 ║ 3 ║ 3 ║ 0 ║
╠════╬════════╬═══════════╬═══════════╣
║ 3 ║ 2 ║ 1 ║ 0 ║
╠════╬════════╬═══════════╬═══════════╣
║ 1 ║ 1 ║ 1 ║ 0 ║
║ 2 ║ 1 ║ 2 ║ 0 ║
╚════╩════════╩═══════════╩═══════════╝

私は現在、次のORDER BYようなものを使用しています:

SELECT *
FROM reports as r
ORDER BY
    FIND_IN_SET(r.job_id, ( SELECT GROUP_CONCAT(job_id ORDER BY id DESC)
                            FROM reports
                            WHERE action_id = 1)),
    r.action_id

ただし、繰り返しは考慮されていません。そのちょっとしたロジックをどこに当てはめることができるかわかりません。誰か助けてもらえますか?

どうもありがとう!

4

1 に答える 1

1

興味深いですが、それほど複雑ではありません..自己結合と副選択を使用するだけです。さらに、order by が読みやすくなったと思います。

http://sqlfiddle.com/#!2/7f9d2/1/0

SELECT r.id, r.job_Id, r.action_id, r.iteration,  r2.mid, r2.job_Id
FROM raw r
INNER JOIN (SELECT max(ID) mID, Job_ID, iteration 
           FROM raw 
           WHERE action_ID=1 
           GROUP BY Job_Id, iteration) r2
 on R.Job_Id = R2.Job_ID
 and R.Iteration = R2.iteration
ORDER BY r2.mid desc, iteration, r.action_Id

ここで重要なのは、最初に概説したグループをまとめることです。サブ選択を実行して各グループ内の最大 ID を取得し、それらのグループをベース セットに結合してから、自己結合/サブクエリからの最大 ID に基づいて並べ替えを適用します... およびその他のロジック...あなたが求めているものを手に入れてください。

セットの観点から SQL を考えてみると、この並べ替えがより簡単になります。

グループと各グループの最大値を定義する一連のデータが必要です (私のインライン ビュー)。次に、サブセットの最大値、反復、マスター セットのアクションに基づいて並べ替える必要があります。

フィドルに移植したときに一部のデータが台無しになった場合に備えて、左結合を使用しましたが、インナーも同様に機能するはずです。

于 2014-12-12T18:08:36.383 に答える