在我的场景中,员工会定期检查(某种)物品。我想显示员工的姓名和他们执行的检查次数。
我的查询结果
+------------------+------------------+
| employee | inspections |
+------------------+------------------+
| Peter Griffin | 864 |
| Chris Griffin | 655 |
| Meg Griffin | 647 |
| Lois Griffin | 457 |
| Stewie Griffin | 332 |
+------------------+------------------+
我的查询有点工作,但我在表active
中有一个名为item
的字段,它应该从COUNT
中排除它(该项目不会被检查) 。 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
表格概述
表格说明
ITEM: 员工合作的项目。
ITEM_SUPERVISOR: 将项目连接到员工。可以将多个员工连接到一个特定项目。
INSPECTION_SCHEDULE: 每隔一个月检查一次的项目将有6个条目,每个月都有相应的数字。
答案 0 :(得分:1)
您当前的设计可以在没有监督员工的情况下安排项目,并且可以在没有安排的情况下拥有监督员工。您当前的查询要求提供具有监督员工并已安排的活动项目的数据。
您必须确定您的设计是否正确,如果没有,请更正。如果您希望所有计划项目都具有监督员工,则其外键应引用Item_supervisor而不是Item。那么也许你的查询是你想要的。
如果您的设计正确,那么您似乎不想要该查询。您必须决定所需的查询。没有监督员工的项目没有监督员工姓名。如果您想要每个监督员工的结果行,那么只有当前查询才有意义。如果您希望在分组之前每次有效检查都有一个结果行,那么您可能会为没有监督员工的项目创建一个组。你可以通过启动FROM with Inspection_schedule LEFT JOIN Item_supervisor ON item_id来获得它,它为无监督的项目提供了一个NULL employee_id。然后加入Item和Employee。您将在一个组中获得所有NULL employee_id。
PS您的表格描述对用户更新或查询数据库没有帮助。您需要它们的格式为ITEM:&#34;属于客户 customer_id 的项目 item_id 位于 location_id 且活动< / em> = 1是否处于活动状态&#34;。只有在每个基表中给出这样的谓词时,我们才能分辨出哪些值实际属于它。或者通过在表(基础或查询结果)中或不在其中来了解关于应用程序的一行值。然后,您需要确定要在查询结果中显示的行的谓词。