2017-02-07 1 views
0

私のシナリオでは、従業員は(ある種の)アイテムを定期的に検査します。従業員の名前と実行した検査の数を示したい。MYSQL複数の結合が必要なすべての行を返しません。従業員 - 管理者 - 項目検査

結果作品の私のクエリの並べ替え

+------------------+------------------+ 
| employee   | inspections  | 
+------------------+------------------+ 
| Peter Griffin |    864 | 
| Chris Griffin |    655 | 
| Meg Griffin  |    647 | 
| Lois Griffin  |    457 | 
| Stewie Griffin |    332 | 
+------------------+------------------+ 

私のクエリから、私はCOUNT(項目がでないことがあるから、それを除外することになっているテーブルitemactiveというフィールドを持っています検査された)。 WHERE i.active = 1には正しい効果がありません。まだアクティブでないアイテムはカウントされます。クエリを逆に選択してを選択してのアクティブなアイテムをi.active = 0とすると、数多くのアイテムがactive = 0の場合は7とカウントされます。私は間違って何をしていますか?

マイクエリ

SELECT concat(e.first_name,' ',e.last_name) AS employee, COUNT(insp.item_id) AS inspections 
FROM employee e, 
inspection_schedule insp, 
item_supervisor super, 
item i 
WHERE i.active = 1 
and e.employee_id = super.employee_id 
AND super.item_id = i.item_id 
AND insp.item_id = i.item_id 
GROUP BY employee 
ORDER BY inspections DESC 

表の概要

Table overview

表の説明

品目:従業員の仕事項目。

ITEM_SUPERVISOR:アイテムを従業員に接続します。 1つの特定の項目に複数の従業員を接続することができます。

INSPECTION_SCHEDULE:隔月に検査する項目は、月の対応する数の6つのエントリを持つことになります。

+1

これを理解するのに役立つ少しのデータを追加してください。 –

+1

*「i.active = 0のアクティブなアイテムを選択しないようにクエリを逆にすると、アクティブなアイテムが数百になるとカウントは7になります」* あなたが話しているこれらのアイテムには、 inspection_schedule。条件を照会すると、そのようなレコードは除外されます。 –

+1

'item'と' inspection_scedule'テーブルの論理的関係は何ですか?スキーマから見ると少なくとも少なくとも1 - *です。それは実際に '1 - 1'か' 1 - 0..1'ですか? –

答えて

1

あなたの現在のデザインでは、従業員を監督することなくスケジュールされたアイテムを持つことができ、スケジュールされていない監督従業員を持つことができます。現在のクエリでは、従業員を監督してスケジュールされているアクティブなアイテムのデータが要求されます。

デザインが正しいかどうかを判断し、そうでない場合は修正しなければなりません。すべてのスケジュールされたアイテムに従業員を監督させたい場合、その外部キーはItemの代わりにItem_supervisorを参照する必要があります。それからあなたの質問があなたが望むものかもしれません。

デザインが正しい場合は、そのクエリは不要です。あなたはあなたが望むクエリーを決める必要があります。監督従業員を持たない項目には、従業員名を監督しません。監督従業員ごとに結果行が必要な場合は、現在のクエリだけが意味を持ちます。グループ化する前にアクティブな検査ごとに結果行を表示するには、監督従業員のないアイテムのグループがあると考えられます。 Inspection_schedule LEFT JOIN Item_supervisor ON item_idを使用してFROMを開始すると、管理対象外のアイテムにNULL employee_idが与えられます。次に、ItemとEmployeeに参加します。 1つのグループにすべてのNULL employee_idを取得します。

PSテーブルの説明は、ユーザーがデータベースを更新またはクエリするのに役立ちません。フォーム項目のようにそれらを必要とする:「顧客へCUSTOMER_IDに属するアイテムのitem_idで= 1アクティブをLOCATION_IDされ、それがアクティブであるかどうかさ」。そのような述部を与えた場合にのみ、基本表ごとにが実際にどの行の値に属しているかを知ることができます。または、テーブル内(ベースまたはクエリ結果)にあるか、その中にいないことによって、アプリケーションの値の行が何を示しているかを知ることができます。次に、照会結果に含める行の述部を決定する必要があります。

+0

まずは、ありがとうございます! あなたが言ったように、私はすべてのスケジュールされたアイテムが従業員を監督することを望みます。私は外部キーを修正し、item_supervisorに欠けている行をいくつか追加しました。クエリは完全に今機能します。 ITEM - ITEM_SCHEDULEは、1 ... 0 .. *の関係を持つことが許可されています。 上記の「テーブルの説明」は、SQLの説明ではありません。ちょうど何か私はすぐにもっと正確に書きました。しかし、思考がたくさんあり、睡眠が少なすぎると、おそらく私は何の意味も持たなかったでしょう。 – wyldcard

関連する問題