3

特定の値が最大の行から値を取得したい (この例では、最も古いメンバー)

Select * from members where age=max(age)

これは機能しますか?

また、同年代の最年長メンバーが複数いる場合はどうなりますか?

(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

これはInvalid use of group function、より良い使用法であるため、これは機能しませんSELECT * FROM members ORDER BY age DESC LIMIT 1

于 2012-06-20T07:51:22.653 に答える
2

いいえ。

あなたがしたい

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

自動インクリメントについての言及で示唆されているように、テーブルに最後に挿入された ID を探している場合は、

 Select LAST_INSERT_ID()
于 2012-06-20T07:51:05.293 に答える
1

GROUP BY@variableを使用して最小/最大値を見つけて保存し、最後にHAVINGと一致するフィルターを使用すると、単一のSELECTステートメントで実行できます。

idageの少なくとも 2 つの列を持つテーブルメンバーがあると仮定すると、次のようなステートメントを使用できます。

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

複数のメンバーの最大年齢が同じ場合でも、これは 1 行のみを返します。

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 では、ほとんどの場合、サブクエリを使用するバージョンよりも高速になります (特に [メンバー] が列 [年齢] にインデックスを持っている場合)。

于 2012-08-29T03:19:58.490 に答える