我有两张桌子:
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
答案 0 :(得分:1)
你快到了。所需要的只是一个HAVING
条款来比较每个自助服务亭的自行车数量和容量。
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的帮助。