こんにちは StackOverflow コミュニティ:
状況
各レコードの比較方法に従って、テーブル内のすべてのレコードのランクを設定する更新クエリを作成しています。表の例:
id | budget | cost | rank | rank_score
1 | 500 | 20 | ? | ?
2 | 400 | 40 | ? | ?
3 | 300 | 40 | ? | ?
したがって、この表でcost
は、ランクを決定する際に最も重みがあり、次に が続きbudget
ます。したがって、レコード #2 が上位にランク付けされ、レコード #3 が 2 番目、レコード #1 が最後になります。ご覧のとおり、2 つのレコードの が同じcost
である場合budget
、引き分けになります。
今、そのような「重み」を簡単に追跡するために、とrank_score
の連結を保持する列を作成しています。したがって、上の表の は次のようになります。cost
budget
rank_score
id | budget | cost | rank | rank_score
1 | 500 | 20 | ? | 20500
2 | 400 | 40 | ? | 40400
3 | 300 | 40 | ? | 40300
これrank_score
は次のように入力できます。
UPDATE table_name
SET rank_score = CONCAT(cost, budget);
問題
これまでのところすべて順調です。しかし、ここで問題が発生します。rank
並べ替えなどのいくつかのために整数のみの列が必要ですが、何よりもユーザーに自分の記録のランクを表示するために必要です。もちろん、このrank
列は、rank_scores の降順と等しくなります。rank
しかし、サブクエリやphpでのループなどを行わずに、単一の更新クエリでこの列を計算する方法を見つけることができません.
私が試したこと
したがって、最初は次のrank_score
ような計算を取得しようとしていました。
SELECT id,
CONCAT(cost, budget) AS rank_score
FROM table_name ;
次に、これらすべてのrank_scoresをphpでループして、次のようなクエリを作成します。
UPDATE table_name
SET rank_score = CASE id WHEN 1 THEN 20500 END,
rank = CASE id WHEN 1 THEN 3 END
WHERE id IN (1) ;
... もちろん、このサンプルの更新クエリは完全ではありませんWHEN THEN END
。テーブル内の各レコードに対してより多くの句があるためです。言うまでもなく、何千ものレコードがあると予想される場合は特に、これは見苦しいものです。
したがって、結論として、私はすでに を計算する方法を持っていますが、同じクエリで、または少なくともそのクレイジーな php ループと句を実行せずに (= ランク スコアの降順で)rank_score
計算したいと考えています。rank
CASE WHEN THEN END
これを読んで考えてくれてありがとう;)
明確化
@ SJuan76 の発言の明確化: ユーザーに一度に一定量のレコードが表示される場合があるため (たとえば、ユーザー ページ: SELECT * WHERE user_id = 333
、1、3、または 8 レコードを取得できる)、 php 経由でランクを割り当てることはできません。彼は、各レコードのランクを知る必要があります。その場合、php を介してランクを割り当てることは機能しません。そのようなランクは、テーブル内のすべてではなく、フェッチされたレコードに関連するためです。