簡體   English   中英

MYSQL多重連接不會返回Employee-Supervisor-Item-Inspection的所有所需行

[英]MYSQL Multiple join doesn't return all wanted rows re Employee-Supervisor-Item-Inspection

在我的情況下,員工定期檢查(某種)物品。 我想顯示一名雇員的姓名和他們執行的檢查次數。

我的查詢結果

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

我的查詢工作正常,但是我在表item有一個稱為active的字段,應該將其從COUNT排除(該項將不被檢查)。 WHERE i.active = 1的效果不正確。 無效的項目仍會被計算在內。 當存在數百個active = 0的項目時,反轉查詢以選擇i.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

表格總覽

表格總覽

表說明

項目:員工合作的項目。

ITEM_SUPERVISOR:將項目連接到員工。 可以將一個以上的員工連接到一個特定的項目。

INSPECTION_SCHEDULE:每隔一個月要檢查的項目將有6個條目,每個月對應的編號。

您當前的設計可以在沒有監督員工的情況下安排項目,也可以在沒有安排員工的情況下安排監督員工。 您當前的查詢要求提供具有主管員工並已計划的活動物料的數據。

您必須確定您的設計是否正確,否則請進行更正。 如果希望所有計划的物料都具有主管員工,則其外鍵應引用Item_supervisor而不是Item。 然后,也許您的查詢就是您想要的。

如果您的設計正確,那么您似乎不需要該查詢。 您必須確定所需的查詢。 沒有主管員工的項目沒有主管員工的姓名。 如果您想要每個主管員工的結果行,則只有當前查詢才有意義。 如果您希望在分組之前進行每次主動檢查的結果行,則大概您將有一個分組,其中包含沒有主管員工的項目。 通過使用Inspection_schedule LEFT JOIN Item_supervisor ON item_id來啟動FROM,可以為不受監管的項目提供NULL employee_id。 然后加入Item和Employee。 您將在一組中獲得所有NULL employee_id。

PS您的表描述對用戶更新或查詢數據庫沒有幫助。 您需要它們采用ITEM形式:“屬於客戶customer_id的項目item_id位於location_id,並且active = 1是否處於活動狀態”。 只有為每個基表提供這樣的謂詞 ,我們才能知道哪些值行實際上屬於該基表。 或者通過位於表(基礎或查詢結果)中或不存在於表中,知道一行值對應用程序的說明。 然后,您需要為要包含在查詢結果中的行確定一個謂詞。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM