【问题标题】:How to order by a "calculated" (not MySQL function) value?如何按“计算”(不是 MySQL 函数)值排序?
【发布时间】:2017-05-10 11:41:21
【问题描述】:

有学生和他们的分数:

Student:
ID NAME
1  a
2  b
3  c
4  d

Mark:
ID STUDENT_ID MARK
1  1          4
1  1          2
1  3          4

我想获得一份关于他们平均分数的有序列表,以获得:

a, (4+2)/2
b, -,
c, 4/1
d, -

我不能在选择时计算它,甚至不能将它存储在学生表的列中。有趣的部分是当我想要对结果进行排序和限制(分页)时。要获得正确的排序,我必须知道所有平均值 - 所以我不会使用没有 LIMIT 的 SELECT 查询。但是怎么做?理想情况下,按 ID 或 NAME 订购很容易。

【问题讨论】:

  • 听起来你需要一个中间表并用一些聚合值填充它......看起来像 SUM(MARK) / COUNT(StudentId)。
  • 从你的约束 我不能在 SELECT-ing 时计算它这听起来像是一个学术练习。如果您解释该约束的要点,这将有所帮助。请edit您的问题。
  • @AntDC:当然,但这是应该避免的。每次选择都是开销!

标签: mysql


【解决方案1】:

您可以按表达式排序,包括子查询:

order by (select avg(mark) from marks m where m.student_id = s.id)

我不确定我是否愿意将此作为分页的一部分,除非基础数据非常小。

【讨论】:

    【解决方案2】:

    您可以通过此查询获得平均分数的用户:

    SELECT student.*, AVG(mark.mark) as average_mark
    FROM users
    LEFT OUTER JOIN mark m on m.student_id= users.id
    GROUP BY users.id
    ORDER BY average_mark DESC
    

    【讨论】:

    • 当然,但这是应该避免的。每次选择都是开销!
    • 所以,你可以使用limit和offset进行分页。您可以限制结果,这不会是开销。如果我理解您的问题有误,请纠正我。
    猜你喜欢
    • 2016-01-08
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    • 2012-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多