てくてくテック

【LeetCode】181. Employees Earning More Than Their Managers 8日目

leetcode

どーも!

今回は

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;

モバイルバージョンを終了