MySQL で union all を使用してユニオンソートを取得する方法

MySQL で union all を使用してユニオンソートを取得する方法

プロジェクトでは、何らかの不可逆的な理由により、テーブルに保存されたデータがページの表示要件を満たすことが困難な場合があります。前回のプロジェクトでは記事の内容を表示する機能がありました。記事は保留中、公開済み、オフラインの 3 つの状態に分かれていました。

データテーブル内のステータスを決定するために使用されるフィールド(PROMOTE_STATUS)の値は、それぞれ 0、1、2 です。当初の要件では、記事は保留中と公開済みとしてのみ表示され、公開済みが保留中よりも前にリストされ、2 つの状態がそれぞれの状況に応じて並べ替えられるというものでした。この実装は比較的単純で、次の order by ステートメントで実現できます。

PROMOTE_STATUS 降順、SEQUENCE_ID 降順で並べ替えます......

テスト後、この製品は最適化できると感じ、記事の表示を公開済み、公開予定、オフラインに変更する必要がありました (そう、オフラインが突然必要になり、誇らしげに最後に配置されました)。ではどうすればいいのでしょうか?他の同僚もこのテーブルを使用しているため、PROMOTE_STATUS の対応する値 (リリース済み、リリース保留中、オフライン) を 2、1、0 に変更することは絶対に不可能です。こちらの対応が変更になった場合。他の同僚のコードの判断ロジックを変更する必要があります。

そこで、すべての結合を考え、3 つの状態の記事の表示順序も実装する必要がありました。したがって、最終的なアイデアは、PROMOTE_STATUS がそれぞれ 1、0、2 の場合のデータを見つけ、各状態の状況に応じて順序を並べ替え、最後に各サブセットを結合してページに返して表示することです。

最終的な SQL ステートメントは次のようになります。

選択
    PROMOTE_ID、
    シーケンスID、
    PROMOTE_STATUS、
    PROMOTE_TITLE、
    発売日
    から (
      (選択
        PROMOTE_ID、
    シーケンスID、
    PROMOTE_STATUS、
        PROMOTE_TITLE、
        発売日 
       SYS_TEXT_PROMOTE から
       どこ
         ENABLED_FLAG = '1'
         PROMOTE_STATUS=1 かつ
         かつ SORT_ID = #{params.sortId}
         SEQUENCE_ID DESC、LAST_UPDATE_DATE DESC で並べ替え) a)
すべて結合
選択
    PROMOTE_ID、
    シーケンスID、
    PROMOTE_STATUS、
    PROMOTE_TITLE、
    発売日
    から (
      (選択
        PROMOTE_ID、
    シーケンスID、
    PROMOTE_STATUS、
        PROMOTE_TITLE、
        発売日 
       SYS_TEXT_PROMOTE から
       どこ
        ENABLED_FLAG = '1'
        PROMOTE_STATUS=2 かつ
        かつ SORT_ID = #{params.sortId}
        RELEASE_DATE DESC、LAST_UPDATE_DATE DESC で並び替え) b)
すべて結合
選択
    PROMOTE_ID、
    シーケンスID、
    PROMOTE_STATUS、
    PROMOTE_TITLE、
    発売日
    から (
      (選択
        PROMOTE_ID、
    シーケンスID、
    PROMOTE_STATUS、
        PROMOTE_TITLE、
        発売日 
       SYS_TEXT_PROMOTE から
        どこ
        ENABLED_FLAG = '1'
        かつ PROMOTE_STATUS=0
        かつ SORT_ID = #{params.sortId}
        RELEASE_DATE DESC、LAST_UPDATE_DATE DESC で並び替える) c)

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • MySQL ユニオン構文コード例の分析
  • mySQL UNION演算子のデフォルトルールの研究
  • MySQL における UNION と UNION ALL の基本的な使い方
  • MySQL の union と union all の簡単な分析
  • MySQL で複数行のデータを 1 行にマージする方法
  • MYSQLはUnionを使用して2つのテーブルのデータを結合し、表示します。

<<:  Linux サーバーの状態を監視する方法

>>:  Docker での Redis 接続の急増をトラブルシューティングした実践的な記録

推薦する

CSS ボックスを中央揃えするためのよく使われるいくつかの方法 (要約)

最初のもの: CSSの位置プロパティの使用 <スタイル タイプ="text/css&...

MySQLデータベースが大きすぎる場合にバックアップと復元を行う方法

コマンド: mysqlhotcopyこのコマンドは、ファイルをコピーする前にテーブルをロックし、不完...

Nginx でファイル ホットリンク保護サービスを構築する方法を学ぶ例

序文多くのサイトが、ポイントやゴールドコインなど、情報のダウンロードに料金を請求していることは誰もが...

Vue は、デスクトップから Web ページにファイルをドラッグするためのサンプル コードを実装します (画像/オーディオ/ビデオを表示できます)

効果使用する場合は、コードとスタイルを自分で最適化してください。画像を表示しない/ビデオとオーディオ...

DD DT DLタグの使用例

通常は <ul><li> タグを使用しますが、dd タグと dt タグも便利...

IE8 開発者ツール メニューの説明

<br />この記事では、開発者ツールのさまざまなメニューについて簡単に説明しました。こ...

Mysql5.7.14 Linux版のパスワードを忘れた場合の完璧な解決策

/etc/my.confファイルで、[mysqld]の下に次の行を追加します: skip-grant...

mysql 8.0.15 winx64 解凍バージョン グラフィック インストール チュートリアル

システムをインストールした後、毎回いくつかのソフトウェアを再インストールする必要があります。ソフトウ...

Docker Compose を使用して nginx のロード バランシングを実装する方法

Dockerネットワーク管理とコンテナIP設定に基づいてNginxロードバランシングを実装するすべて...

Javascript Echarts 空気質マップ効果の詳細な説明

まず、空気質データと地図データを組み合わせる必要があります。マップデータには属性名があるさまざまな都...

Vueは左上と右上のスライドナビゲーションを実装します

ナビゲーションなどは日々の開発でよく使うので、記録として記事を書きます。ナビゲーションは終了/開始位...

Vue の img の src 画像アドレスの動的スプライシングの問題について

Vue での img の動的スプライシングを見てみましょう。src 画像アドレス、具体的な内容は次の...

LeetCode の SQL 実装 (181. 従業員は管理職よりも収入が高い)

[LeetCode] 181.従業員の収入が管理職よりも多い従業員テーブルには、マネージャーを含む...

MySql におけるプロセス制御関数/統計関数/グループ化クエリの使用法の分析

これからの道のりは長く困難ですが、私は探求を続けます。また週末がやってきました。引き続き、皆さんと一...