我有以下 SQL 选择语句
SELECT first_name, year FROM users WHERE username='$username'
这可以返回许多结果,因为每年可能存在一个用户记录,例如 2012 年、2011 年等一个。因此我只想从用户记录存在的最近一年中获取用户的详细信息。
有什么想法我该怎么做?
谢谢
我有以下 SQL 选择语句
SELECT first_name, year FROM users WHERE username='$username'
这可以返回许多结果,因为每年可能存在一个用户记录,例如 2012 年、2011 年等一个。因此我只想从用户记录存在的最近一年中获取用户的详细信息。
有什么想法我该怎么做?
谢谢
Select top 1 first_name, year
from users
where username ='$username'
order by year desc
您可以找到用户的最大年份,然后将其嵌套,以便您只选择具有该年份的一条记录。
SELECT first_name, year FROM users U1 WHERE username='$username'
and year = (select max(year) FROM users U2 WHERE U1.username=U2.username)
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
做这件事有很多种方法:
如果您只需要一个用户,那么 Avitus 的答案(使用 LIMIT 而不是 TOP 调整为 Postgres)可能是最好的答案。请注意,如果用户有多行具有相同的“顶级”年份,您将只看到一个。可能这没关系,如果不是,下面的解决方案可以解决这个问题。
如果您需要在单个语句中为多个用户执行此操作,则这样的操作可能比使用来自 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;
您可以根据需要向结果中添加任意数量的列,但您需要在内部和外部查询中执行此操作。
PostgreSQL 最简单的形式:
SELECT first_name, year
FROM users
WHERE username = '$username'
ORDER BY year DESC
LIMIT 1;