MySQL 每组最大 n 只适用于多行

MySQL greatest n per group only works with more than one row

我有以下booktable

id time teacher book class
1 22-05-25 03:20:39 21 null 1
2 22-05-25 03:20:39 21 7853 2
3 22-05-25 03:20:39 21 7854 2
4 22-05-25 03:20:39 21 7855 2
5 22-05-25 03:20:39 21 7856 2

及以下SQL

SELECT t0_.*    
FROM book t0_
    LEFT JOIN book t1_ ON (t0_.teacher= t1_.teacher AND t0_.id < t1_.id)
WHERE
    t0_.book IS NOT NULL AND
    t0_.teacher IN (21) AND
    t1_.id IS NULL;

这按预期工作,返回 id 5。但是当 t0_.book IS NOT NULL 更改为 t0_.book IS NULL 时,我得到空白结果而不是 id 1。所以我尝试了另一种方法

SELECT t0_*, MAX(t0_.id) AS uid
FROM book t0_
WHERE
    t0_.book IS NOT NULL AND
    t0_.teacher IN (21) AND
GROUP BY t0_.time

这次我得到了 id 2 而不是 id 5。 当定位包含一行或多行的记录时,如何获得最大的行?

编辑: 为了进一步说明问题和需要什么,我正在从每个 class 中寻找最伟大的老师,其中与老师相关的书是空的。通常它可以是一个数字或不为空。对于第一个查询,我已经完成测试并发现它按预期工作,但仅在目标行不止一个的情况下。很自然地,我的假设解释是,由于使用了左连接,因此可能无法将单独的行与其自身进行比较。因此转向第二种解决方案 - 这似乎有效,但并非完全有效。

如果书是空的,我怎样才能得到每个 class 最伟大的老师?不知道要不要再说清楚。

您需要将 t1_ 限制为仅具有 book = NULL 的其他行。否则,您将空行与 non-null 行连接起来,并且始终存在匹配项,因此 t1_.id IS NULL 检查将失败。

将条件 AND t1_.book IS NULL 添加到 ON 条件。

SELECT t0_.*    
FROM book t0_
    LEFT JOIN book t1_ ON (t0_.teacher= t1_.teacher AND t0_.id < t1_.id) 
        AND t1_.book IS NULL
WHERE
    t0_.book IS NULL AND
    t0_.teacher IN (21) AND
    t1_.id IS NULL;

DEMO