2

スコア、プロであるかどうか、および体重クラスに基づいて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 が適用されている場合の問題であり、どこに配置すればよいかわかりません。

4

2 に答える 2

2

「ORDER BY score DESC」を結合されたサブクエリに移動すると、正しい結果が得られることがわかりました。

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,
        #the score column in the form of a subquery
        (select score from fa_scores where fa_scores.fighter_id = fa_fighters.fighter_id) DESC) 
    as fighters using (fighter_id)
于 2012-07-02T20:28:53.297 に答える
0

テーブル TABLE には除算のインデックスがあるように見えます。そのため、出力はそのようになります。

クエリを作成するときに を指定しないorder byと、テーブルにはまったく順序がありません。インデックスを使用しても、何らかの順序がありますが、巨大なテーブルでは 100% の精度ではありません。

select.....再開すると、クエリには順序と結合を含む INSERT がありますが、それは出力が入力と同じ順序になるという意味ではありません。私のアドバイスは、常にORDER BYUNIQUEまたはPRIMARY KEY(少なくともそのうちの1つ)を指定して持つことです。

于 2012-07-02T18:59:52.917 に答える