MYSQL多个连接不会返回所有需要的行,而不是Employee-Supervisor-Item-Inspection

时间:2017-02-07 01:59:17

标签: mysql sql database-design

在我的场景中,员工会定期检查(某种)物品。我想显示员工的姓名和他们执行的检查次数。

我的查询结果

+------------------+------------------+
| 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

表格概述

Table overview

表格说明

ITEM: 员工合作的项目。

ITEM_SUPERVISOR: 将项目连接到员工。可以将多个员工连接到一个特定项目。

INSPECTION_SCHEDULE: 每隔一个月检查一次的项目将有6个条目,每个月都有相应的数字。

1 个答案:

答案 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;。只有在每个基表中给出这样的谓词时,我们才能分辨出哪些值实际属于它。或者通过在表(基础或查询结果)中或不在其中来了解关于应用程序的一行值。然后,您需要确定要在查询结果中显示的行的谓词。