まず、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システムに移行するオプションを検討することができます。