次のSQL選択ステートメントがあります
SELECT first_name, year FROM users WHERE username='$username'
ユーザー レコードは 2012 年、2011 年など、1 年ごとに存在する可能性があるため、これは多くの結果を返す可能性があります。したがって、ユーザー レコードが存在する最新の年からユーザーの詳細のみを取得したいと考えています。
どうすればこれを行うことができますか?
ありがとう
次のSQL選択ステートメントがあります
SELECT first_name, year FROM users WHERE username='$username'
ユーザー レコードは 2012 年、2011 年など、1 年ごとに存在する可能性があるため、これは多くの結果を返す可能性があります。したがって、ユーザー レコードが存在する最新の年からユーザーの詳細のみを取得したいと考えています。
どうすればこれを行うことができますか?
ありがとう
Select top 1 first_name, year
from users
where username ='$username'
order by year desc
ユーザーの最大年を見つけ、それをネストして、その年の 1 つのレコードのみを選択することができます。
SELECT first_name, year FROM users U1 WHERE username='$username'
and year = (select max(year) FROM users U2 WHERE U1.username=U2.username)
PostgreSQL の最も単純な形式:
SELECT first_name, year
FROM users
WHERE username = '$username'
ORDER BY year DESC
LIMIT 1;
これを行うにはいくつかの方法があります。
これが単一のユーザーにのみ必要な場合は、Avitus の回答 (TOP の代わりに LIMIT を使用して Postgres に調整されたもの) がおそらく最適です。ユーザーが同じ「上位」年を持つ行を複数持っている場合、表示されるのは 1 つだけであることに注意してください。おそらくこれで問題ありませんが、そうでない場合は、次の解決策で修正できます。
単一のステートメントで複数のユーザーに対してこれが必要な場合、このようなものは、おそらく user1988097 からの相関サブクエリを使用するよりも高速です。
select first_name,
year
from (
select first_name,
year,
max(year) over (partition by username) as max_year
from users
) t
where year = max_year;
結果には好きなだけ列を追加できますが、内部クエリと外部クエリでそれを行う必要があります。
MySQL
SELECT first_name,MAX(year) FROM users WHERE username = 'username'
それ以外に、GROUP BY
句を追加する必要があります。
SELECT first_name,MAX(year)
FROM users
WHERE username = 'username'
GROUP BY username