gpt4 book ai didi

MySQL : Having doesn't work

转载 作者:行者123 更新时间:2023-11-29 01:49:56 24 4
gpt4 key购买 nike

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

最佳答案

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 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

关于MySQL : Having doesn't work,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48472097/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com