0

ゲームのスコアの表があります。プレイしたミッションごとに 1 行。各ユーザーの最高スコアを取得するために、ユーザーごとに 1 行で各ミッションの最大スコアを取得するクエリを作成しました。これらのスコアは、追加の列 (mission_1 およびmission_2) として追加されます。ここまでは順調ですね。

しかし今、これら 2 つのフィールドを合計して、各ユーザーの合計最大スコアを取得したいと考えています。ただし、MySQL では許可されず、「フィールド リスト」に不明な列「mission_1」と表示されます。

これらのフィールドを何らかの方法で合計することは可能ですか?

また、別の列 (mission_1_id とmission_2_id) に最大スコアがあるミッションに対応する row_ids (テーブルの gsid) を取得できるかどうかも疑問です。でもMAX()を使っているので、うまくいかない気がします。

SELECT m . * , max( m.id ) as max_id, max( submitted_on ) AS max_submitted_on, 
ifnull( max(CASE WHEN mission =1 THEN score END ) , 0 ) AS mission_1_score, 
ifnull( max(CASE WHEN mission =2 THEN score END ) , 0 ) AS mission_2_score,
mission_1_score + mission_2_score AS total_score
FROM game_sessions m
GROUP BY username
4

2 に答える 2

0

いいえ、同じselectステートメントではありません。サブクエリが必要か、式を繰り返す必要があります。

サブクエリ メソッド:

select m.* max_id, max_submitted_on, mission_1_score, mission_2_score,
       mission_1_score + mission_2_score AS total_score
from (SELECT m . * , max( m.id ) as max_id, max( submitted_on ) AS max_submitted_on, 
            ifnull( max(CASE WHEN mission =1 THEN score END ) , 0 ) AS mission_1_score, 
            ifnull( max(CASE WHEN mission =2 THEN score END ) , 0 ) AS mission_2_score,
            mission_1_score + mission_2_score AS total_score
      FROM game_sessions m
      GROUP BY username
     ) m

それ以外の場合は、元のselectステートメントを次のように変更します。

SELECT m . * , max( m.id ) as max_id, max( submitted_on ) AS max_submitted_on, 
       ifnull( max(CASE WHEN mission =1 THEN score END ) , 0 ) AS mission_1_score, 
       ifnull( max(CASE WHEN mission =2 THEN score END ) , 0 ) AS mission_2_score,
       (ifnull( max(CASE WHEN mission =1 THEN score END ) , 0 ) +
        ifnull( max(CASE WHEN mission =2 THEN score END ) , 0 )
       ) AS total_score

これは洗練されていないように見えますが、SQL 標準の一部です。次のような場合に曖昧さを避けることが目的だと思います。

select (a + b) as a, (a + 1) as c

aでとはどういう(a + 1)意味ですか? SQL 標準では、テーブル内の列を参照することは明確です。

于 2013-04-22T13:29:47.337 に答える
0

あなたが使用することができます

   max(CASE WHEN mission =1 THEN score END ) 
于 2013-04-22T13:29:50.390 に答える