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
子句,用于将每个售货亭的自行车数量与容量进行比较。
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 的帮助。
我有两个 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
子句,用于将每个售货亭的自行车数量与容量进行比较。
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 的帮助。