MySQL返回id出现次数>属性值

时间:2015-03-11 20:19:31

标签: mysql join count

我有两张桌子:

Bike__________________________       Kiosk  

使用列:

BikeID, Location_________________    KioskID, Capacity  

和数据如:

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

等...位置是指向kioskid的外键。我正在尝试编写一个只返回具有容量的自助服务终端的KioskID的查询。换句话说,如果在自助服务终端1停放7辆自行车,则返回自助终端1。如果5辆自行车停放在售货亭2,则不予退回。我能够编写返回每个信息亭自行车数量的代码,但是对于如何使用这个(嵌套查询?)只返回容量> gt(count)的信息亭感到困惑。

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

3 个答案:

答案 0 :(得分:1)

你快到了。所需要的只是一个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,以隐含地明确外键关系是什么。

答案 1 :(得分:0)

我认为您可能正在寻找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

答案 2 :(得分:0)

正确的代码:

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子句中的所有别名和包含容量,我得到了最终的代码。感谢@Lieven Keersmaekers和@Jim Dennis的帮助。