sql >> データベース >  >> RDS >> Mysql

別のテーブルのMAX()値によるMySQL結果セットの順序付け

    select
      p.ID,
      e.NAME
    from
      Paychecks p
      inner join Employee e on p.EmployeeID = e.ID
    group by
      p.ID
    order by
      max(p.AmountPaid) desc
    

    より論理的に見えますが、遅くなる可能性がある(テストする必要がある)別の書き方は次のとおりです。

    select
      e.ID,
      e.NAME
    from
      Employee e
      inner join Paychecks p on p.EmployeeID = e.ID
    group by
      e.ID
    order by
      max(p.AmountPaid) desc
    

    数千万の行があるため、すべてのクエリの速度が遅くなることがありますが、適切なインデックスを使用すると、これは可能な限り高速になります。基本的に、Paychecks.EmployeeIDとPaychecks.AmountPaidを組み合わせた1つのインデックスが必要だと思います。また、Employee.IDのインデックスが役立つ場合があります。

    結合が最終的にあなたを殺している場合は、2つのクエリを実行できます。 1つ目は、給与をEmployeeIDでグループ化し、max(PaycheckAmount)で並べ替えるだけで、2つ目は各IDの名前を取得するために使用できます。参加すると、希望よりもパフォーマンスが高くなることがあります。500人の従業員に対して1,000万の給与を受け取った場合、2つのステップで行う方が速い場合がありますが、平均して約1600年間会社で働いていることを意味します。 。;-)



    1. カテゴリごとに上位10件のレコードを選択

    2. MMOゲームとデータベース設計

    3. Mysqlはデフォルトのテーブル文字セットをデータベース文字セットに変更します

    4. MySQLテーブルに行が存在するかどうかをテストするための最良の方法