【问题标题】:SQL: Count the number of times two tables share a foreign keySQL:计算两个表共享外键的次数
【发布时间】:2018-02-05 13:32:20
【问题描述】:

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

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

第二个表 Chef 有两个外键:chef_idkitchen_idkitchen_id 是引用 Kitchen 的外键。

第三个表 Waiter 有两个外键:waiter_idkitchen_idkitchen_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


【解决方案1】:

这让您可以了解不止一次合作的所有厨师和服务员。有关示例,请参阅此 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 是非标准的,但在这种情况下它也不是必需的,可以省略)

【讨论】:

  • 您应该将LEFT JOIN 更改为INNER JOIN。无论如何你都会得到相同的结果,但会更清楚。
  • @JuanCarlosOropeza 同意并针对一般情况进行了更改。最后,连接类型将取决于应用程序的要求,而不是我们自己来制作。
  • 如果添加ORDER BY chefs.id, waiters.id, kitchen.name;GROUP_CONCAT 将在所有行的相同顺序上显示厨房名称。
【解决方案2】:

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

如果您希望女服务员与“特定酋长”相匹配,您可以这样做:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-05
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    相关资源
    最近更新 更多