編集 3 - MySQL のバージョンは 8.0.33 です。
編集 2 - 最終的に動作するコードについては下部を参照してください。ありがとう@アキナ!
スポーツイベントのスコアシートがあります。テーブルには、選択したい 3 つの関連フィールドがあります -
scoreID
(主キー値として) classifierID
特定のコース レイアウトに関する詳細を含む別のテーブルの主キーにマップしますcalculatedPercent
は特定のイベントの結果ですテーブルには他に WHERE 句で使用するフィールドが 3 つありますが、これらは付随的なものです。
calculatedPercent に最適な 4 つの値を選択し、
classifierID を繰り返すことができないことを指定するクエリを生成する必要があります。プロセスの後の段階で使用するために、
scoreID を取得できる必要があります。
リーリー
当初、これは素晴らしいことだと思いました。なぜなら、指定されたメンバーのscoreID 値に対して最も高い
calculatedPercent 値を持つ行が選択されるからです。その後、複数のメンバーが同じコースで 1 番目と 2 番目に高い得点を獲得していることに気付きました。これは、
classifierID 値を繰り返してはいけないという要件に違反していました。
次に試したこと:
リーリー
これは次のエラー メッセージです:
#1055 - ORDER BY 句の式 #1 は GROUP BY 句内になく、GROUP BY 句内の列に機能的に依存しない非集計列 '.masterScores.calculatedPercent' を含んでいます。 sql_mode=only_full_group_bymasterScoresと互換性がありません
.scoreID
列に MIN と MAX を使用することを検討しましたが、期待どおりに機能しません。scoreID
は主キーの値ではありません。常に選択されているcalculatedPercent
の値。 scoreID
が主キーであるため、ANY_VALUE 集計を使用することでこれを修正できるとどこかで読みました。これを試してみました:
リーリー
一見すると、これは機能しているように見えますが、bestPercent 値と一致する
値を常に返すとは限りません。
繰り返しますが、目標は次のとおりです:
ごとに 1 つの calculatedPercent
値と 1 つの scoreID
値のみが選択されます。 classifierID
でグループ化しないと、各 classifierID
には WHERE 句を満たす 0 ~ 400 行が含まれる可能性があるため、ここでは GROUP BY が適切だと思います。
に対して選択された calculatedPercent
がすべてのオプションの最高値であることを確認してください
値を選択していることを確認してください。
値に基づいて降順で並べ替えられていることを確認します。
値が、選択した calculatedPercent
と実際に同じ行を表していることを確認します (現在、これがパーセンテージが計算されるポイントです) ) 私のクエリは失敗しました)。
スコアID | 分類子ID | 最良のパーセンテージ |
---|---|---|
58007 | 42 | 66.60 |
63882 | 42 | 64.69 |
64685 | 54 | 64.31 |
58533 | 32 | 63.20 |
55867 | 42 | 62.28 |
66649 | ###7###56.79 | |
12 | 50.28 | |
1 | 49.52 | |
41.10 | これは、クエリを実行したときの望ましい出力です: |
スコアID
最良のパーセンテージ | ||
---|---|---|
66.60 | 64685 | |
64.31 | 58533 | |
63.20 | 66649 | ###7###|
これは、クエリを実行したときの実際の出力です: |
分類子ID
55867 | ||
---|---|---|
64685 | 54 | |
58533 | 32 | |
55349 | ###7###56.79 | |
図に示すように、実際の出力の 1 行目と 4 行目の | scoreID | の値が正しくありません。現時点では、あらゆる提案を歓迎します。 |
問題が発生した 6 つのケースに対してこれをテストすることができ、解決策によってすべての問題が解決されました。 @アキナさん、またよろしくお願いします!
は、この問題を解決済みとしてマークします。
リーリー
リーリー PS. MySQL バージョンが 8 の場合は、CTE でサブクエリの代わりに(classifierID,calculatedPercent)
が一意でない場合、classifierID
ごとに複数の行を受け取る可能性があります。この場合、必要なのはROW_NUMBER()
を使用する必要があります。リーリー