ホームページ  >  に質問  >  本文

1 つのフィールドで GROUP BY を使用し、別のフィールドで ORDER BY を使用する MySQL SELECT

編集 3 - MySQL のバージョンは 8.0.33 です。

編集 2 - 最終的に動作するコードについては下部を参照してください。ありがとう@アキナ!

スポーツイベントのスコアシートがあります。テーブルには、選択したい 3 つの関連フィールドがあります -

  1. scoreID (主キー値として)
  2. classifierID 特定のコース レイアウトに関する詳細を含む別のテーブルの主キーにマップします
  3. calculatedPercent は特定のイベントの結果です

テーブルには他に WHERE 句で使用するフィールドが 3 つありますが、これらは付随的なものです。

calculatedPercent に最適な 4 つの値を選択し、classifierID を繰り返すことができないことを指定するクエリを生成する必要があります。プロセスの後の段階で使用するために、scoreID を取得できる必要があります。

これは私の最初のクエリです:

リーリー

当初、これは素晴らしいことだと思いました。なぜなら、指定されたメンバーの

scoreID 値に対して最も高い calculatedPercent 値を持つ行が選択されるからです。その後、複数のメンバーが同じコースで 1 番目と 2 番目に高い得点を獲得していることに気付きました。これは、classifierID 値を繰り返してはいけないという要件に違反していました。

SELECT DISTINCT を試してみましたが、最終的に本当に必要なのは GROUP BY であることに気付き、調べてみたところ、MySql でクエリを実行すると、only_full_group_by に関連するエラーが発生することがわかりましたが、完全には解決しませんでした。私 問題です。

次に試したこと:

リーリー

これは次のエラー メッセージです:

#1055 - ORDER BY 句の式 #1 は GROUP BY 句内になく、GROUP BY 句内の列に機能的に依存しない非集計列 '.masterScores.calculatedPercent' を含んでいます。 sql_mode=only_full_group_by

と互換性がありません

masterScores

.scoreID 列に MIN と MAX を使用することを検討しましたが、期待どおりに機能しません。scoreID は主キーの値ではありません。常に選択されているcalculatedPercent の値。 scoreID が主キーであるため、ANY_VALUE 集計を使用することでこれを修正できるとどこかで読みました。これを試してみました: リーリー 一見すると、これは機能しているように見えますが、bestPercent 値と一致する

scoreID

値を常に返すとは限りません。 繰り返しますが、目標は次のとおりです:

    指定された WHERE 句に基づいて、
  1. classifierID

    ごとに 1 つの calculatedPercent 値と 1 つの scoreID 値のみが選択されます。 classifierID でグループ化しないと、各 classifierID には WHERE 句を満たす 0 ~ 400 行が含まれる可能性があるため、ここでは GROUP BY が適切だと思います。

  2. 各グループの
  3. classifierID

    に対して選択された calculatedPercent がすべてのオプションの最高値であることを確認してください

  4. 4 行のみが選択されていること、およびこれらの行が最も高い
  5. calculatedPercent

    値を選択していることを確認してください。

  6. 選択した 4 行が
  7. calculatedPercent

    値に基づいて降順で並べ替えられていることを確認します。

  8. 選択した各行の
  9. scoreID

    値が、選択した calculatedPercent と実際に同じ行を表していることを確認します (現在、これがパーセンテージが計算されるポイントです) ) 私のクエリは失敗しました)。

  10. 以下はデータのサブセットです。例:
###7### 553925822655349 ###7### これは、クエリを実行したときの望ましい出力です:
スコアID 分類子ID 最良のパーセンテージ
58007 42 66.60
63882 42 64.69
64685 54 64.31
58533 32 63.20
55867 42 62.28
6664956.79
12 50.28
1 49.52
41.10

スコアID分類子ID58007425432 ###7### 56.79これは、クエリを実行したときの実際の出力です:
最良のパーセンテージ
66.60 64685
64.31 58533
63.20 66649
スコアID

分類子ID最良のパーセンテージ4266.6064.3163.20 ###7### 図に示すように、実際の出力の 1 行目と 4 行目の の値が正しくありません。 現時点では、あらゆる提案を歓迎します。 編集 2 - 最終的な解決策
55867
64685 54
58533 32
5534956.79
scoreID
リーリー

問題が発生した 6 つのケースに対してこれをテストすることができ、解決策によってすべての問題が解決されました。 @アキナさん、またよろしくお願いします! は、この問題を解決済みとしてマークします。

P粉715274052P粉715274052405日前525

全員に返信(1)返信します

  • P粉696891871

    P粉6968918712023-09-11 13:48:48

    リーリー

    (classifierID,calculatedPercent) が一意でない場合、classifierID ごとに複数の行を受け取る可能性があります。この場合、必要なのは

    リーリー PS. MySQL バージョンが 8 の場合は、CTE でサブクエリの代わりに ROW_NUMBER() を使用する必要があります。


    リーリー

    返事
    0
  • キャンセル返事