MySQL 每组最大 n 只适用于多行
MySQL greatest n per group only works with more than one row
我有以下book
table
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;
我有以下book
table
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;