どーも!
今回は
Employees Earning more Than Their Managersを解いたのでそれについてです!
Employees Earning More Than Their Managers
問題は以下です。
問題の内容としては...
そのままなのですが、DBのテーブルがあり、各社員(マネージャ含む)の給料、その社員のマネージャ(上司)等の情報が入ったテーブルから、もしもマネージャよりも給料が高い。
部下(そのマネージャの部下)がいる場合、それを出力するselect文を書け...といった感じですね。
イメージとしては上記リンク先の例をおかりすると...
+----+-------+--------+-----------+
| Id | Name | Salary | ManagerId |
+----+-------+--------+-----------+
| 1 | Joe | 70000 | 3 |
| 2 | Henry | 80000 | 4 |
| 3 | Sam | 60000 | NULL |
| 4 | Max | 90000 | NULL |
+----+-------+--------+-----------+
// 出すべき出力(Joeのマネージャはid3のSamだが、部下であるJoeの方がSalaryが高い)
+----------+
| Employee |
+----------+
| Joe |
+----------+
こんな感じです!
では、アルゴリズムを考えよう...
アルゴリズム
さて、それでは解決策を考えていきます...
やることとしてはメンバーのManagerIdを調べ、そのManagerIdのユーザーのSalaryともともとのメンバーのSalaryを比較、もしも意図した形でなければ、そのメンバーの名前をEmployeeとして出力...といった具合ですね。
今回はこのEmployeeテーブルを複数つかって考えようと思います。
INNER JOINで自己結合をして、自分のテーブルの他の値との比較....を実現してみます。
以下の問題と似たような形です。
ここまでは以下のような感じでしょう。
欲しいのは、メンバーの名前を"Employee"というカラム名として欲しいため、AS句で指定しています。
その後、INNER JOINで自己結合をしています。
select e1.Name AS Employee from Employee e1 INNER JOIN Employee e2
そして、そのあとの条件としては...
where e1.ManagerId = e2.Id
AND e1.Salary > e2.Salary;
上記のように、まず二つのEmployeeテーブルのe1のManagerIdとe2のIdが等しく、なおかつその給料比較(e1.Salaryがメンバーの給料、e2.Salaryがマネージャの給料)がおかしいものだけ、出力するようにします。
これで、マネージャがいて、なおかつそのマネージャの給料がおかしいユーザーの名前だけでてきますね...!
では最後に提出したコードを載せておきます。
提出したコード
Runtime: 353 ms, faster than 43.22% of MySQL online submissions for Employees Earning More Than Their Managers.
Memory Usage: 0B, less than 100.00% of MySQL online submissions for Employees Earning More Than Their Managers.
MySQLではメモリは使わないので100%になるっぽいですね!
# Write your MySQL query statement below
select e1.Name AS Employee from Employee e1 INNER JOIN Employee e2
where e1.ManagerId = e2.Id
AND e1.Salary > e2.Salary;