スコア、プロであるかどうか、および体重クラスに基づいてMMAファイターをランク付けし、ファイター部門を作成するmysqlクエリを作成しようとしています。体重、ステータス (プロまたはアマチュア)、およびその他の列を含むすべての戦闘機を含むテーブルがあります。また、すべての戦いから計算されたスコアを含むテーブルもあります。レコードは部門とスコアの両方で並べ替える必要がありますが、クエリを部門別に並べ替えることができるだけです。
INSERT INTO fa_rankings (fighter_id, rank, division)
SELECT
fa_scores.fighter_id,
@r := CASE WHEN @div <> f_division THEN 1 ELSE @r+1 END as f_rank,
@div := f_division
FROM
(SELECT @div := NULL) d,
(SELECT @r := 0) r,
fa_scores
JOIN (SELECT fa_fighters.fighter_id,
CONCAT(
IF(status = 'professional', 'a', 'b'),
CASE
WHEN weight < 126 THEN 0
WHEN weight BETWEEN 126 AND 135 THEN 1
WHEN weight BETWEEN 136 AND 145 THEN 2
WHEN weight BETWEEN 146 AND 155 THEN 3
WHEN weight BETWEEN 156 AND 170 THEN 4
WHEN weight BETWEEN 171 AND 185 THEN 5
WHEN weight BETWEEN 186 AND 205 THEN 6
WHEN weight BETWEEN 206 AND 265 THEN 7
ELSE 8 END) as f_division
FROM fa_fighters
ORDER BY f_division ASC) as fighters using (fighter_id)
ORDER BY score DESC
これは、最後の order by ステートメントの場所と関係があると思いますが、結合されたクエリでは機能しないため、他にどこに置くべきかわかりません。現在、このクエリは次を生成します。
Rankings Table Compared with Scores
+------------+------+----------+ +-------+
| fighter_id | rank | division | | score |
+------------+------+----------+ +-------+
| 131 | 1 | a1 | | 0 |
| 23 | 2 | a1 | | 34 |
| 332 | 3 | a1 | | 4 |
| 1233 | 1 | a2 | | 0 |
| 643 | 2 | a2 | | 44 |
+------------+------+----------+ +-------+
編集:結合を使用しない以前のクエリがありましたが、それは戦闘機がプロであるかどうかによってのみグループ化され、そのクエリはランキングを正しく適用したため、結合に何か関係があると思われます.
編集:これが私の選択からの出力です
SELECT * ,
(SELECT CONCAT_WS( ' ', f_name, l_name ) FROM fa_fighters WHERE fa_fighters.fighter_id = fa_rankings.fighter_id)
AS name,
(SELECT score FROM fa_scores WHERE fa_scores.fighter_id = fa_rankings.fighter_id)
AS score
FROM `fa_rankings`
WHERE 1
ORDER BY division, rank ASC
LIMIT 0 , 30
編集:スコアでレコードを並べ替えていますが、間違ったポイントにあります。ランクを決定した後、スコアで並べ替えているため、生のテーブルはスコアで並べ替えられますが、ファイターには正しいランクが関連付けられていません。ランク カウンターを実行して各ファイターのランクを決定する前に、レコードをスコア順に並べ替えるクエリが必要です。これは、クエリの実行時に ORDER BY が適用されている場合の問題であり、どこに配置すればよいかわかりません。