MySQL:没有用

时间:2018-01-27 02:48:24

标签: mysql having

我正在使用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行。

4 个答案:

答案 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 BYSELECT子句中不在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子句

  • HAVING过滤记录,用于汇总GROUP BY结果。
  • HAVING适用于汇总的组记录,而WHERE适用于单个记录。
  • 仅返回符合HAVING标准的组。
  • HAVING要求存在GROUP BY子句。
  • WHERE和HAVING可以在同一个查询中。