0

hourly_rate各プロジェクトで 2 番目に高い従業員を計算したいと考えています。でもどこが悪いのかわからない

私の関係するテーブル構造:

project_team: project_code (FK), employee_id (FK), hourly_rate

これは、2 番目に高くない唯一のレコードを与える私のクエリです。

注: 私には 3 つのプロジェクトがあり、各プロジェクトには多くの従業員がいます。

SELECT * FROM (
    SELECT * FROM project_team GROUP BY project_code ORDER BY hourly_rate DESC LIMIT 1,1
) e;
4

1 に答える 1

2

joins平等に限らず、入会も可能<です。これは、 が見つかった場合、よりも小さいmax(hourly_rate)すべてのものに基づいてその結果に結合でき、それも同じ を持ち、そこから再びグループ化して、結合されたテーブルから値を取得するだけでよいことを意味します。hourly_ratemaxproject_codemax

select p1.project_code, max(p2.hourly_rate)
from
 (select project_code, max(hourly_rate) r from project_team group by project_code) p1
 left join project_team p2
   on p2.project_code = p1.project_code and p2.hourly_rate < p1.r
group by project_code;

(これは、2 番目に高い率が常に存在することを前提としています (すべての従業員の率が同じか、1 人の従業員のみ))

select p1.project_code, ifnull(max(p2.hourly_rate), p1.r) 
from
 (select project_code, max(hourly_rate) r from project_team group by project_code) p1
 left join project_team p2
   on p2.project_code = p1.project_code and p2.hourly_rate < p1.r
group by project_code;

そして、2 番目に高い値がない場合、これが最高値になります。

デモフィドル

select t.project_code, t.second_max_rate, t2.employee_id
from
  (select p1.project_code, ifnull(max(p2.hourly_rate), p1.r)  second_max_rate
    from
     (select project_code, max(hourly_rate) r from project_team group by project_code) p1
    left join project_team p2
      on p2.project_code = p1.project_code and p2.hourly_rate < p1.r
  group by project_code) t
  inner join project_team t2
    on t.project_code = t2.project_code and t.second_max_rate = t2.hourly_rate
  group by t.project_code;

このバージョンには従業員も含まれています - ただし、 に関して mysqls の寛大さを悪用していることに注意してください。group by従業員を取得しますが、同じ割合で複数の従業員がいる場合、どの従業員を取得できるかについての保証はありません。

于 2015-04-17T05:17:58.847 に答える