特定の値が最大の行から値を取得したい (この例では、最も古いメンバー)
Select * from members where age=max(age)
これは機能しますか?
また、同年代の最年長メンバーが複数いる場合はどうなりますか?
(auto_increment を使っているので気にしなくていいのですが、ふと気になりました)
ありがとう。
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
ランダムなデータよりも特定のデータを優先する場合は、必要に応じて を追加できます。
これはInvalid use of group function
、より良い使用法であるため、これは機能しませんSELECT * FROM members ORDER BY age DESC LIMIT 1
いいえ。
あなたがしたい
Select * from Members
where Age = (Select Max(Age) from Members)
自動インクリメントについての言及で示唆されているように、テーブルに最後に挿入された ID を探している場合は、
Select LAST_INSERT_ID()
GROUP BYと@variableを使用して最小/最大値を見つけて保存し、最後にHAVINGと一致するフィルターを使用すると、単一のSELECTステートメントで実行できます。
idとageの少なくとも 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);
複数のメンバーの最大年齢が同じ場合でも、これは 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 ;
同じことを行うためのより工夫された方法もあります。
SELECT * FROM members m
WHERE NOT EXISTS (
SELECT 1 FROM members m2
WHERE m1.age < m2.age )
このクエリは、ほとんどのデータベースに移植可能であり、PK の自動増加に対応し、同じ年齢の複数の人にも機能します。さらに、少なくとも SQL Server では、ほとんどの場合、サブクエリを使用するバージョンよりも高速になります (特に [メンバー] が列 [年齢] にインデックスを持っている場合)。