MySQL : 有没有用
MySQL : Having doesn't work
我正在使用 MySQL。这是我的架构:
Tableb
Column Name | Type | Primary key
id | int | Yes
seq | int | Yes
amt | int
虚拟数据
id | seq | amt
1 | 1 | 4000
1 | 2 | 3000
1 | 3 | 2000
1 | 4 | 5000
2 | 1 | 4000
2 | 2 | 3000
3 | 1 | 2000
3 | 2 | 5000
我想要select具有等效id和seq最大值的记录。
这是我的 SQL
SELECT b.id, b.seq, b.amt
FROM b
WHERE b.id = 1
AND b.seq =
(SELECT max(b.seq) FROM b WHERE b.id = 1)
但我想知道是否有更优雅的方式来实现我想要的。
例如,
SELECT b.id, b.seq, b.amt
FROM b
WHERE b.id = 1
HAVING b.seq = max(b.seq)
但它没有按预期工作。它 returns 0 行。
对数据进行排序,只取第一条记录
SELECT b.id, b.seq, b.amt
FROM b
WHERE b.id = 1
ORDER BY seq desc
limit 1
鉴于你的简单例子,这个怎么样:
SELECT b.id, b.seq, b.amt
FROM b
WHERE b.id = 1 ORDER BY b.seq DESC limit 1;
HAVING
子句将与 GROUP BY
子句一起使用,您的查询中缺少该子句。要向您的查询添加 GROUP BY
子句,我们必须在查询中包含所有没有聚合函数的字段,因此除 seq
:
之外的所有字段
SELECT b.id, b.seq, b.amt
FROM b
WHERE b.id = 1
GROUP BY b.id, b.amt
HAVING b.seq = MAX(b.seq)
现在这显然不会给你正确的结果,因为你只想按 id
而不是 amt
分组。另一个问题是你不能在 SELECT
或 HAVING
子句中使用不在 GROUP BY
子句中的字段,因此你不能在这两个地方使用 seq
,上面的查询会给你一个错误。
如果您的目标是获取 id = 1
的记录,那么您的第一个查询就可以了,或者最好使用 juergen 的答案中的查询。但是如果你真正的目标是select每组一个记录,那么你可以这样做:
SELECT b.id, b.seq, b.amt
FROM b
INNER JOIN (SELECT id, MAX(seq)
FROM b
GROUP BY id) bb ON bb.id = b.id AND bb.seq = b.seq
结果将是:
id | seq | amt
1 | 4 | 5000
2 | 2 | 3000
3 | 2 | 5000
SQL HAVING 子句
- HAVING 筛选对汇总的 GROUP BY 结果起作用的记录。
- HAVING 适用于汇总组记录,而 WHERE 适用于单个记录。
- 只返回符合 HAVING 条件的组。
- HAVING 要求存在 GROUP BY 子句。
- WHERE 和 HAVING 可以在同一个查询中。
我正在使用 MySQL。这是我的架构:
Tableb
Column Name | Type | Primary key
id | int | Yes
seq | int | Yes
amt | int
虚拟数据
id | seq | amt
1 | 1 | 4000
1 | 2 | 3000
1 | 3 | 2000
1 | 4 | 5000
2 | 1 | 4000
2 | 2 | 3000
3 | 1 | 2000
3 | 2 | 5000
我想要select具有等效id和seq最大值的记录。 这是我的 SQL
SELECT b.id, b.seq, b.amt
FROM b
WHERE b.id = 1
AND b.seq =
(SELECT max(b.seq) FROM b WHERE b.id = 1)
但我想知道是否有更优雅的方式来实现我想要的。 例如,
SELECT b.id, b.seq, b.amt
FROM b
WHERE b.id = 1
HAVING b.seq = max(b.seq)
但它没有按预期工作。它 returns 0 行。
对数据进行排序,只取第一条记录
SELECT b.id, b.seq, b.amt
FROM b
WHERE b.id = 1
ORDER BY seq desc
limit 1
鉴于你的简单例子,这个怎么样:
SELECT b.id, b.seq, b.amt
FROM b
WHERE b.id = 1 ORDER BY b.seq DESC limit 1;
HAVING
子句将与 GROUP BY
子句一起使用,您的查询中缺少该子句。要向您的查询添加 GROUP BY
子句,我们必须在查询中包含所有没有聚合函数的字段,因此除 seq
:
SELECT b.id, b.seq, b.amt
FROM b
WHERE b.id = 1
GROUP BY b.id, b.amt
HAVING b.seq = MAX(b.seq)
现在这显然不会给你正确的结果,因为你只想按 id
而不是 amt
分组。另一个问题是你不能在 SELECT
或 HAVING
子句中使用不在 GROUP BY
子句中的字段,因此你不能在这两个地方使用 seq
,上面的查询会给你一个错误。
如果您的目标是获取 id = 1
的记录,那么您的第一个查询就可以了,或者最好使用 juergen 的答案中的查询。但是如果你真正的目标是select每组一个记录,那么你可以这样做:
SELECT b.id, b.seq, b.amt
FROM b
INNER JOIN (SELECT id, MAX(seq)
FROM b
GROUP BY id) bb ON bb.id = b.id AND bb.seq = b.seq
结果将是:
id | seq | amt
1 | 4 | 5000
2 | 2 | 3000
3 | 2 | 5000
SQL HAVING 子句
- HAVING 筛选对汇总的 GROUP BY 结果起作用的记录。
- HAVING 适用于汇总组记录,而 WHERE 适用于单个记录。
- 只返回符合 HAVING 条件的组。
- HAVING 要求存在 GROUP BY 子句。
- WHERE 和 HAVING 可以在同一个查询中。