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 分组。另一个问题是你不能在 SELECTHAVING 子句中使用不在 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 可以在同一个查询中。