我正在使用MySQL。这是我的架构:
表b
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
我想选择具有等效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)
但它没有按预期工作。它返回0行。
答案 0 :(得分:2)
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
分组。另一个问题是,您无法使用GROUP BY
或SELECT
子句中不在HAVING
子句中的字段,因此您无法在这两个地方使用seq
,上面的查询会给你一个错误。
如果您的目标是获取id = 1
的记录,那么您的第一个查询就可以,或者更好地在juergen的答案中使用该查询。但如果您的真正目标是为每个组选择一条记录,那么您可以这样做:
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
答案 1 :(得分:1)
订购数据并仅拍摄第一条记录
SELECT b.id, b.seq, b.amt
FROM b
WHERE b.id = 1
ORDER BY seq desc
limit 1
答案 2 :(得分:0)
举个简单的例子,如何:
SELECT b.id, b.seq, b.amt
FROM b
WHERE b.id = 1 ORDER BY b.seq DESC limit 1;
答案 3 :(得分:0)
SQL HAVING子句