【问题标题】:Mins of Max SQL最大 SQL 分钟数
【发布时间】:2017-05-11 19:05:28
【问题描述】:
Semesters Table
+----+------+
| ID | Name |
+----+------+
|  1 |  1st | 
|  2 |  2nd |
+----+------+

Subjects Table
+----+-------------+-------------+
| ID | Semester Id |        Name |
+----+-------------+-------------+
|  1 |           1 | Mathematics |
|  2 |           1 |     English |
|  3 |           2 | Mathematics |
|  4 |           2 |     English |
+----+-------------+-------------+

Tests Table
+----+------------+-------+
| ID | Subject ID | Score |
+----+------------+-------+
|  1 |          1 |    70 |
|  2 |          1 |    75 |
|  3 |          2 |    75 |
|  4 |          2 |    70 |
|  5 |          3 |    75 |
|  6 |          3 |    70 |
|  7 |          4 |    70 |
|  8 |          4 |    75 |
+----+------------+-------+    

我可以通过在测试 ID 上使用 MAX 来获得第二次测试的分数,然后按主题 ID 对它们进行分组。但是,我必须得到按学期分组的最低分数。

是否有可能在单个 SQL 语句中获得每学期最低分数的第二次测试?

结果集如下所示。

+----------+-------------+-------+
| Semester |     Subject | Score |
+----------+-------------+-------+
|      1st |     English |    70 |
|      2nd | Mathematics |    70 |
+----------+-------------+-------+

这是在 MySQL 中。

【问题讨论】:

  • MySQL。我考虑过创建视图然后加入视图,但是当有数百个测试时,这可能会出现问题。
  • order by something desc limit 2something 的值为您提供两个最低的结果。请注意,如果有几个同样低的值,您不会以这种方式获得所有值。请考虑使用analytical functions
  • 您的示例只有两个测试。为什么“第二”不是最低限度?你怎么处理领带?

标签: mysql sql join group-by


【解决方案1】:

您正在寻找每学期第二低的测试。

为每学期的有序测试构建行号,并保留编号为 #2 的那些。一种方法是关联子查询。另一个是变量。

select 
  sem.name as semester,
  sub.name as subject, 
  tst.score
from semesters sem 
join subjects sub on sub.semester_id = sem.id
join tests tst on tst.subject_id = sub.id
where
(
  select count(*)
  from subjects sub2
  join tests tst2 on tst2.subject_id = sub2.id
  where sub2.semester_id = sub.semester_id
    and sub2.id <= sub.id
    and tst2.score <= tst.score
) = 2
order by sub.semester_id;

如果出现平局,则选择其中一行,如您的示例所示。

使用变量可能比上述查询更快。您可以通过查找如何在 MySQL 中模拟 ROW_NUMBER 轻松找到该方法。 (其他 DBMS 使用ROW_NUMBER 更简单,但 MySQL 没有此功能。)

【讨论】:

    【解决方案2】:
    select a.name as semester
         , b.name as subject
         , min(c.score) as lowestscore
    from subjects as b
       join semesters as a on a.id = b.semester_id
       join tests as c on c.subject_id = b.id
    group by a.name, b.name
    

    您可能想要订购或其他东西,但这应该会给您想要的东西。您可以为学期或科目范围添加更多鉴别器,但这将产生学期名称、科目名称和该学期/科目的最低分数。

    【讨论】:

      猜你喜欢
      • 2023-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-31
      相关资源
      最近更新 更多