MySQL Return id where occurrence count > 属性值

MySQL Return id where occurance count > attribute value

我有两个 table:

Bike__________________________       Kiosk  

有列:

BikeID, Location_________________    KioskID, Capacity  

和数据如:

1, 1 ___________________________     1, 10  
2, 1 ___________________________     2, 5  
3, 1 ___________________________     3, 15 
4, 2  
5, 1  

等... Location 是指向 kioskid 的外键。我正在尝试编写一个查询,其中 return 仅包含具有容量的信息亭的 KioskID。换句话说,如果 7 辆自行车停在 kiosk 1,kiosk 1 是 returned。如果 5 辆自行车停在售货亭 2 上,则不会 returned。我能够编写 return 统计每个售货亭的自行车数量的代码,但对于如何将此(嵌套查询?)用于 return 只有容量>计数(* ).

SELECT k.kioskid, COUNT(*)  
FROM kiosk AS k  
JOIN bike AS b ON b.location = k.kioskid  
GROUP BY k.kioskid  

你快到了。所需要的只是一个 HAVING 子句,用于将每个售货亭的自行车数量与容量进行比较。

SQL Fiddle

SELECT k.kioskid
FROM   kiosk k
       left outer join bike b on b.location = k.kioskid
GROUP BY
       k.kioskid
HAVING 
       COUNT(*) < MAX(k.Capacity)

作为旁注,我强烈建议将 location 列重命名为 kioskid 以隐式明确外键关系是什么。

我想您可能正在寻找 HAVING,如:

SELECT k.kioskid, COUNT(kiosk.location) AS cap
FROM kiosk AS k  
JOIN bike AS b ON b.location = k.kioskid  
GROUP BY k.kioskid HAVING cap > k.capacity

正确代码:

SELECT kioskid, COUNT(location), capacity
FROM kiosk AS k  
JOIN bike  ON location = kioskid  
GROUP BY kioskid 
HAVING COUNT(location)  < capacity;  

在进一步研究这个问题后,我发现了这个错误的两个问题。 1. 由于 MySQL 由内而外工作,因此由 AS 子句建立的任何别名必须存在于最内层的代码中——在本例中为 HAVING 子句。 2、SQL标准要求HAVING必须只引用GROUP BY子句中的列或聚合函数中使用的列。但是,MySQL 支持对此行为的扩展,并允许 HAVING 引用 SELECT 列表中的列以及外部子查询中的列。因此,通过删除所有别名并在 SELECT 子句中包含 capacity,我终于让代码可以工作了。感谢@Lieven Keersmaekers 和@Jim Dennis 的帮助。