MySQL MAX函数混合行

MySQL MAX函数混合行,mysql,sql,Mysql,Sql,我有一个查询SELECT id,MAX(value)FROM table1,它返回正确的值,但它使用表的第一个id,而不是与返回的值相对应的id(id是主键)。 我已经看到了解决方案,但它们都需要一个WHERE子句,我不能在我的案例中使用。我想您忘记了一个group by子句: SELECT id, MAX(value) FROM table1 GROUP BY id 编辑:为了满足您的需要,您可以 SELECT id, MAX(value) FROM table1 GROUP BY id

我有一个查询
SELECT id,MAX(value)FROM table1
,它返回正确的值,但它使用表的第一个id,而不是与返回的值相对应的id(id是主键)。
我已经看到了解决方案,但它们都需要一个WHERE子句,我不能在我的案例中使用。

我想您忘记了一个group by子句:

SELECT id, MAX(value) FROM table1 GROUP BY id
编辑:为了满足您的需要,您可以

SELECT id, MAX(value) 
FROM table1 
GROUP BY id
HAVING MAX(value) = (SELECT MAX(value) FROM table1)

如果您有多个ID的最大值,这可能会给您多个结果。在这种情况下,您可以添加“LIMIT 1”以仅获得一个结果,但这将是非常奇怪和随机的。

我认为您忘记了group by子句:

SELECT id, MAX(value) FROM table1 GROUP BY id
编辑:为了满足您的需要,您可以

SELECT id, MAX(value) 
FROM table1 
GROUP BY id
HAVING MAX(value) = (SELECT MAX(value) FROM table1)

如果您有多个ID的最大值,这可能会给您多个结果。在这种情况下,您可以添加“LIMIT 1”以仅获得一个结果,但这将是非常奇怪和随机的。

我相信您试图做的是返回具有最大值的行id。是这样吗

我很好奇为什么不能使用WHERE子句

但是好的,使用这个约束可以解决这个问题。我将假设您的表在id上是唯一的(如果不是,您应该与构建它的人交谈并询问原因?)

这将按值降序(最大值->最小值)对表进行排序,然后只显示第一行(即“值”最大的行)

如果您的表在id上不是唯一的,您仍然可以按id分组并获得相同的id

SELECT id, max(value) as max_value
FROM table1
GROUP BY id
ORDER BY max_value DESC
LIMIT 1

我相信您要做的是返回具有最大值的行id。是这样吗

我很好奇为什么不能使用WHERE子句

但是好的,使用这个约束可以解决这个问题。我将假设您的表在id上是唯一的(如果不是,您应该与构建它的人交谈并询问原因?)

这将按值降序(最大值->最小值)对表进行排序,然后只显示第一行(即“值”最大的行)

如果您的表在id上不是唯一的,您仍然可以按id分组并获得相同的id

SELECT id, max(value) as max_value
FROM table1
GROUP BY id
ORDER BY max_value DESC
LIMIT 1

首先,回答为什么您的查询会以您观察到的方式运行:我怀疑您运行时没有使用您的查询可能使用的
sql\u mode=only\u full\u group\u by
。正如您所注意到的,这可能会导致一些奇怪的结果

如果仅禁用了_FULL _GROUP _BY,则GROUP BY标准SQL使用的MySQL扩展允许select list、HAVING condition或ORDER BY list引用未聚合的列,即使这些列在功能上不依赖于GROUP BY列。这导致MySQL接受前面的查询。在这种情况下,服务器可以从每个组中自由选择任何值,因此,除非它们相同,否则选择的值是不确定的,这可能不是您想要的

在这种情况下,由于没有
GROUPBY
子句,因此整个表实际上就是GROUP


要获取与表中最大值相关联的一个id,可以选择所有行,按值排序(降序),然后仅限于第一个结果,无需使用聚合运算符(或
其中
caluse):

选择id,表1中的值按值排序描述限制1
请注意,如果有多个ID具有(相同)最大值,则只返回其中一个ID。在评论中,@RaymondNijland指出,这可能会在每次运行时产生不同的结果(对于
id
值始终是最大值),您还可以通过按
id
排序来使其更具确定性:

选择id,表1中的值按值顺序描述,id ASC限制1

类似地,如果出于某种原因同一ID有多个值,如果其中一行恰好是最大值,它仍将返回该ID——谢天谢地,这不适用于本例,正如您提到的,
ID
是主键。

首先,要回答为什么您的查询会以您观察到的方式运行:我怀疑您在运行时没有像您的查询那样使用
sql\u mode=only\u full\u group\u by
。正如您所注意到的,这可能会导致一些奇怪的结果

如果仅禁用了_FULL _GROUP _BY,则GROUP BY标准SQL使用的MySQL扩展允许select list、HAVING condition或ORDER BY list引用未聚合的列,即使这些列在功能上不依赖于GROUP BY列。这导致MySQL接受前面的查询。在这种情况下,服务器可以从每个组中自由选择任何值,因此,除非它们相同,否则选择的值是不确定的,这可能不是您想要的

在这种情况下,由于没有
GROUPBY
子句,因此整个表实际上就是GROUP


要获取与表中最大值相关联的一个id,可以选择所有行,按值排序(降序),然后仅限于第一个结果,无需使用聚合运算符(或
其中
caluse):

选择id,表1中的值按值排序描述限制1
请注意,如果有多个ID具有(相同)最大值,则只返回其中一个ID。在评论中,@RaymondNijland指出,这可能会在每次运行时产生不同的结果(对于
id
值始终是最大值),您还可以通过按
id
排序来使其更具确定性:

选择id,表1中的值按值顺序描述,id ASC限制1

类似地,如果出于某种原因同一ID有多个值,如果其中一行恰好是最大值,它仍将返回该ID——谢天谢地,这不适用于本例,正如您提到的,
ID
是主键。

返回的结果比我希望的多(它返回两个id,尽管它应该只返回实际的最大值id)查看返回更多结果的我的编辑(我没有使用where子句,因为您告诉我,无论出于什么原因,都不能使用where子句)