sql >> データベース >  >> RDS >> Mysql

MySQLヘルプ:別の列の順序に従ってランクを設定する更新クエリを最適化する

    まず、budgetを変更します 、cost およびrank_score

    の代わりに整数または他の数値データ型に
    UPDATE table_name
    SET rank_score = CONCAT(cost, budget) ;
    

    次に、以下を使用します:

    UPDATE table_name
    SET rank_score = cost * 1000 + budget * 1  ;
    

    文字列関数を処理したり、次のようなものを用意したりする必要がないため、より簡単です。

    SELECT * 
    FROM table_name
    WHERE (conditions...)
    ORDER BY rank_score DESC
    

    (括弧:1つのパラメーターを持つ(1000 )他よりも高く設定します(1 )は、cost, budgetの注文に相当します 。これを試して確認してください:

    SELECT * 
    FROM table_name
    ORDER BY cost DESC
           , budget DESC
    

    したがって、rank_scoreを削除することもできます。 もちろん、さまざまなパラメータ値を使って実験を行う予定がない限り、一緒に。

    他の人が指摘しているように、データではなく計算を格納するフィールドを持つことはベストプラクティスではありません。それは非正規化です。 Instaedを使用すると、テーブルを正規化して、必要なときにデータベースに計算を実行させることができます。

    SELECT id, budget, cost, 
           cost*1000 + budget*1 AS rank_score_calculated
    FROM table_name
    ORDER BY rank_score_calculated DESC
    

    rank_score_calculated 上記の例では保存されません。このように、予算やコストが変更されたり、テーブルに新しい行が追加されたりするたびに、計算フィールドを更新する必要はありません。

    欠点は1つだけです。テーブルが非常に大きく、多くのユーザーが頻繁にクエリ(および計算)を実行する必要があり、テーブルが頻繁に更新される場合は、データベースの速度が低下する可能性があります。その場合、そのようなフィールドを追加することを考え始める必要があります。

    もう1つのケースは、絶対的なrankが必要な場合です。 必要に応じて、すべてのテーブル行にわたって。 MySQLには「ウィンドウ」関数がないため、このようなクエリを純粋なSQLで作成するのは非常に困難です。)

    ランクはMySQL変数を使用して計算できます

    SELECT *
         , @rownum:[email protected]+1 AS rank_calculated
    FROM table_name
       , (SELECT @rownum:=0) AS st
    ORDER BY rank_score DESC
    

    そして、それらの値をrankに入れたい場合 、使用:

    UPDATE table_name
             JOIN
             ( SELECT id
                    , @rownum:[email protected]+1 AS rank_calculated
               FROM table_name
                  , (SELECT @rownum:=0) AS st
               ORDER BY rank_score DESC
             ) AS r
             ON r.id = table_name.id
    SET table_name.rank = r.rank_calculated ;
    

    上記の2つのクエリは純粋なSQLではありません。 Postgres、SQL-Server、Oracleなどのウィンドウ関数をサポートする別のdaabaseシステムに移行するオプションを検討することができます。



    1. psycopgを使用した挿入の問題

    2. カテゴリ、サブカテゴリ、および関連する書籍のデータベースを設計する

    3. NVD3.jsで使用するためのMYSQLPDOからのカスタムフォーマットされたJSON

    4. Pythonを使用したSQLの複数の挿入