在聚合函数中选择
Posted
技术标签:
【中文标题】在聚合函数中选择【英文标题】:SELECT inside Aggregate Function 【发布时间】:2021-08-28 17:44:37 【问题描述】:假设我有 3 个这样的表:
class
id
capacity
student
id
student_class
id_student
id_class
SELECT c.id
FROM student_class sc
JOIN class c
ON c.id=sc.id_class
JOIN student s
ON s.id=sc.id_student
HAVING MAX((SELECT(COUNT(sc2.id) FROM student_class sc2 WHERE sc2.id_student=s.id AND sc2.id_course=c.id)/c.capacity))
我想找到注册/容量比率最高的课程。
我应该在聚合函数中使用 select 子句来编写像这样的 having 子句吗?
HAVING MAX((query that gives me the total number of students enrolled in a course)/course capacity))
或者有更好的方法吗?
【问题讨论】:
请提供样本数据和期望的结果。你的问题没有任何意义,除非MAX()
可以返回NULL
或0
。
@GordonLinoff 我编辑提供示例数据
【参考方案1】:
我想找到注册/容量比率最高的课程。
您将使用聚合来计算比率。然后您可以使用ORDER BY
和LIMIT
返回一个值。请注意,即使有平局,这也会返回一行:
SELECT c.id, COUNT(*) / c.capacity as ratio
FROM student_class sc JOIN
class c
ON c.id = sc.id_class
GROUP BY c.id, c.capacity
ORDER BY ratio DESC
LIMIT 1;
【讨论】:
谢谢!所以一般来说不可能在聚合函数中使用查询的结果吧? @Mizzet 。 . .有可能的。它只是没有做你想做的事。 在我写的情况下,那有 max 子句会给我带来什么? @Mizzet 。 . .首先,在大多数数据库中它是不允许的,因为没有GROUP BY
。 mysql 扩展了HAVING
子句的使用。它将不返回任何行(如果条件评估为 0 或 NULL
)或在其他情况下返回所有行。以上是关于在聚合函数中选择的主要内容,如果未能解决你的问题,请参考以下文章