3

我想从具有最大特定值的行中获取值(在本例中,最旧的成员)

Select * from members where age=max(age)

这行得通吗?

如果有超过 1 个年龄最大的成员同龄,会发生什么?

(我不必担心,因为我使用 auto_increment,但我只是好奇)

谢谢。

4

6 回答 6

4
select * 
from members 
where age = (select max(age) as max_age from members);

如果有超过 1 个成员具有相同的最大年龄,您将获得多个结果。要从中选择一个:

select * 
from members 
where age = (select max(age) as max_age from members);
limit 1

order by如果您喜欢任何特定数据而不是随机数据,则可以选择添加一个。

于 2012-06-20T07:53:46.417 回答
2

不。

你要

 Select * from Members 
 where Age = (Select Max(Age) from Members)

如果按照您提到的自动增量的建议,您正在查找表中最后插入的 ID,您想要

 Select LAST_INSERT_ID()
于 2012-06-20T07:51:05.293 回答
2

这不起作用,因为这是Invalid use of group function更好的使用SELECT * FROM members ORDER BY age DESC LIMIT 1

于 2012-06-20T07:51:22.653 回答
1

如果您使用GROUP BY@variable来查找和存储什么是最小/最大值并过滤匹配最后的HAVING ,则可以使用单个SELECT语句来完成。

假设您有一个至少包含两列的表成员: idage,那么您可以使用如下语句:

SELECT id, age, @max:= IF(@max > age, @max, age) FROM members GROUP BY id HAVING(age = @max);

或者

SELECT id, age, @min:= IF(@min < age, @min, age) FROM members GROUP BY id HAVING(age = @min);
于 2016-03-19T11:43:47.357 回答
0

这将只返回一行 - 即使多个成员具有相同的最大年龄:

SELECT *
FROM members
ORDER BY age DESC
LIMIT 1 ;

这(和@podiluska 的回答)将返回所有这些:

SELECT m.*
FROM members AS m
  JOIN
    ( SELECT MAX(age) AS max_age
      FROM members
    ) AS allm
    ON allm.max_age = m.age ;
于 2012-06-20T07:55:13.377 回答
0

还有一种更人为的方式来做同样的事情:

SELECT * FROM members m
WHERE NOT EXISTS (
    SELECT 1 FROM members m2
    WHERE m1.age < m2.age )

此查询可移植到大多数数据库,适用于自动增加的 PK,也适用于具有相同年龄的多人。另外,至少在 SQL Server 中,大多数情况下会比使用子查询的版本更快(尤其是如果 [members] 在 [age] 列上有索引)。

于 2012-08-29T03:19:58.490 回答