【发布时间】:2018-02-05 13:32:20
【问题描述】:
假设我有三张桌子,说明厨师在厨房里和服务员一起工作。
第一个表 Kitchen 有一个主键 id。它还有一个 name 和其他与此问题无关的列。
第二个表 Chef 有两个外键:chef_id 和 kitchen_id。 kitchen_id 是引用 Kitchen 的外键。
第三个表 Waiter 有两个外键:waiter_id 和 kitchen_id。 kitchen_id 是引用 Kitchen 的外键。
我们可以假设,如果 Chef 和 Waiter 中的一行指向同一个 kitchen_id,则他们在同一家餐厅一起工作。厨师和服务员可以在多家餐厅工作。餐馆可以有很多厨师和服务员。多对多。
假设我们想计算哪些服务员曾多次与特定厨师合作(在不同的餐厅)。
我编写了一个查询,可让我在结果表中查看哪些服务器曾与多家餐厅的同一位厨师合作过,但与他们合作过的厨师人数永远不会准确。我不仅找到了不止一次与一位厨师共事过的服务员,我还找到了与不止一位厨师一起在餐厅工作过的服务员。它没有得到我需要的答案。
这里是我的代码!
SELECT Waiter.waiter_id, Chef.chef_id,
COUNT(Chef.chef_id)
FROM Waiter JOIN Chef
ON Waiter.kitchen_id = Chef.kitchen_id
JOIN Kitchen
ON Kitchen.id = Chef.kitchen_id
GROUP BY Waiter.waiter_id, Kitchen.name
HAVING COUNT(Chef.chef_id) > 1;
【问题讨论】:
-
Chef, has two foreign keys: chef_id and kitchen_id.你的意思是 chef_id 是主键, kitchen_id 是外键? -
您使用的是什么 DBMS?
-
如果厨师和服务员可以在不止一家餐厅工作,那么您的数据库设计就很糟糕。您似乎不熟悉多对多关系。
-
您的
group by键与您的select列不匹配。 -
SELECT w.waiter_id, c.chef_id, count() FROM Waiter w INNER JOIN Kitchen k on w.kitchen_id = k.kitchen_id INNER JOIN Chef c ON k.kitchen_id = c.kitchen_Id GROUP BY w.waiter_id, c.chef_id, HAVING COUNT()>1
标签: sql