2017-02-01 14 views
0

私は従業員のテーブルを持っています。各従業員には社員IDがあります。一部の従業員には、別の従業員のIDにリンクする管理者フィールドがあります。従業員は10名あり、うち2名は監督者であり、それぞれが4名を監督しています。私はすべての従業員のリストと彼らが監督する他の従業員の数を取得しようとしています。これまでのところ、私は監督者と彼らが監督する数字を手に入れることしかできないようです。これは私のクエリです:私はRIGHT JOINからJOINを変えてみましたすべての従業員とその人数をmysqlで監視します

SELECT s.employee_name, COUNT(*) 
FROM employee e 
    join employee s on e.supervisor_id= s.employee_id 
group by s. 
order by s.employee_name; 

、それは今、彼らは監督4人を有するものとして示さ2つのスーパーバイザと私にすべての従業員10名が表示されますが、それはよう監督する誰もが持っていない他のすべてを示してい0の代わりに1を持っています。私はそれが私が行方不明の単純なものだと確信しています。

サンプルデータ:私たちは実際のテーブルとそれに参加するのと同じよう

employee_name, employee_name, supervisor_id, 
'10111', 'Sydnee K. Stevens' NULL 
'10870', 'Colton C. Rocha', '10111' 
'11425', 'Astra V. Sharp','10111' 
'12973', 'Melanie X. Rojas','10111' 
'14451', 'Bethany Roman','10111' 
'14597', 'Lydia Edwards', NULL 
'16153', 'Selma Q. Conley', '14597' 
'17730', 'Kristen B. Malone', '14597' 
'17762', 'Barrett B. Bauer', '14597' 
'18628', 'Shana Z. Flowers','14597' 
+0

サンプルデータと予想される結果をご確認ください。 PS - 'some'にスーパーバイザフィールドがありますか? – user3741598

+0

する必要があります "一部の従業員はsupervisor_id" –

+1

"を持っていますが、他のすべての人は0ではなく1を持つと監督する人はいません - これは' COUNT(*) 'のためです。試してみてください。(COUNT(e.supervisor_id)) –

答えて

0

は、常に、少なくとも1になります。 LEFT JOINRIGHT JOINが混乱している)を使用している場合は、右側の表の列から値を数えるだけで済みます。 COUNT(column)は、その列にNULLを持つすべての行を無視します。

SELECT s.*, COUNT(e.supervisor_id) as num_supervised 
FROM employee s 
LEFT JOIN employee e on e.supervisor_id = s.employee_id 
group by s.employee_id 
order by s.employee_name; 
+0

'count(*)'を使った 'left'や' right'が常に少なくとも1つの理由を少し説明できますか?ちょうど私はそれがどのように機能するかをよりよく理解しています。 – user2328273

+0

@ user2328273 'COUNT(*)'は、NOT NULL値を持つ少なくとも1つの列を持つすべての行を数えます。 'COUNT(columnName)'はその列のNOT NULL値を持つ行だけをカウントします。例を見てください。[here](http://rextester.com/JYPH60307) - NULLだけを含む行はありません。 –

+0

@ user2328273また、最初のコメント[here](https://dev.mysql.com/doc/refman/5.7/en/counting-rows.html)を見てください。 –

0

我々は選択して、あなたの従業員表を結合します。 selectは、すべてのsupervisor_idsとsupervisor_idフィールドの出現回数で構成されます(supervisor_idがnullのレコードは無視されます)。 LEFTまたはRIGHT JOINCOUNT(*)を使用して

SELECT e.employee_id, e.employee_name, s.supervising 
FROM employee e 
LEFT JOIN (SELECT supervisor_id, count(*) as supervising 
      FROM employee 
      WHERE supervisor_id is NOT NULL 
      GROUP BY supervisor_id) AS s 
ON(e.employee_id = s.supervisor_id) 
+0

ありがとう、それは期待どおりに動作します。パウロの提案は私がすでに持っていたものの中でも働いていました。問題についての考え方をより多く得ることができます。 – user2328273

関連する問題