我有一个名为user的表,下面以图片形式提供。在给定的表中,我要选择偏移量为1的最大值。
我使用的查询如下:
select offset, max(value) as max_val from user having offset = 1
从上面的查询中我希望得到max_value = 4
,但是得到max_value = 0
。请帮助我。
答案 0 :(得分:2)
带有WHERE
的简单GROUP BY
子句在您的情况下就足够了:
SELECT `offset`, max(value) as max_val
FROM `user`
WHERE `offset` = 1
GROUP by `offset`
也请避免使用reserved words作为列名,您可能需要通过将`(反引号)括起来来转义列名
或与GROUP BY
一起使用
select `offset`, max(value) as max_val
from `user`
group by `offset`
having `offset` = 1
答案 1 :(得分:2)
您可以在此处使用一些技巧,以避免需要使用GROUP BY
此查询(Arulkumar的答案)
查询
SELECT `offset`, max(value) as max_val
FROM `user`
WHERE `offset` = 1
GROUP by `offset`
可以重写为下面的查询。
注意,仅当您根据offset = 1
这样的一种条件进行过滤时,才可能转换,例如offset IN(1, 2)
这样的两个或更多条件
查询
SELECT
'1' AS `offset`
, MAX(CASE WHEN `offset` = 1 THEN `value` END) AS max_val
FROM
a
结果
| offset | max_val |
| ------ | ------- |
| 1 | 4 |
注意
作为'1' AS offset
的有效SQL是文字,因此不需要分组。
因此,它与GROUP BY
有关的ANSI / ISO SQL标准和MySQL sql_mode ONLY_FULL_GROUP_BY
(强制您编写有效的GROUP BY
SQL
请参阅demo
更优化的版本
SELECT
'1' AS `offset`
, MAX(`value`) AS max_val
FROM
a
WHERE
a.`offset` = 1
由于它可以使用索引而不是表扫描,请参见demo
奖金
您还可以在同一表上使用自连接左连接来模拟MAX / MIN聚合函数,从而也避免使用GROUP BY
。
另外,您可以在两个或两个以上的条件下使用它,例如offset IN(1, 2)
模拟最大值
SELECT
*
FROM
a a1
LEFT JOIN
a a2
ON
a1.offset = a2.offset
AND
a1.value < a2.value
WHERE
a2.value IS NULL
结果
| offset | value | offset | value |
| ------ | ----- | ------ | ----- |
| 1 | 4 | | |
| 2 | 4 | | |
| 3 | 4 | | |
答案 2 :(得分:-1)
检查这是查询
SELECT * FROM user WHERE `offset` = 1 ORDER BY value DESC LIMIT 1