SQL:计算两个表共享外键的次数

时间:2018-02-05 13:32:21

标签: sql

假设我有三张桌子,说明在厨房和服务员一起工作的厨师。

第一个表Kitchen是主键 id 。它还有一个名称和其他与此问题无关的列。

第二个表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;

2 个答案:

答案 0 :(得分:0)

您的查询与您的问题有很大不同。

如果你想要女服务员与特定的主管匹配"你这样做:

SELECT Waiter.waiter_id
FROM Waiter 
JOIN Chef
  ON  Waiter.kitchen_id = Chef.kitchen_id
 AND  Chef.chef_id = @YourChef
GROUP BY Waiter.waiter_id
HAVING COUNT (Waiter.waiter_id) > 0

答案 1 :(得分:0)

这可以让您了解不止一次合作的所有厨师和服务员。有关示例,请参阅此SQLfiddle

SELECT 
  chefs.id as chef, 
  waiters.id as waiter, 
  COUNT(chefs.id) AS cowork_count,
  GROUP_CONCAT(kitchen.name) AS kitchens
FROM waiters 
INNER JOIN chefs ON waiters.kitchen_id = chefs.kitchen_id
INNER JOIN kitchen ON kitchen.id = chefs.kitchen_id
GROUP BY waiters.id, chefs.id
HAVING COUNT(chefs.id) > 1
ORDER BY chefs.id, waiters.id;

(适用于MySQL / MariaDB。我认为GROUP_CONCAT是非标准的,但在这种情况下它也是非必要的,可以省略)