Mysql 子查询左连接引用父ID
我正在尝试为每个用户查询最新的汽车:Mysql 子查询左连接引用父ID,mysql,sql,join,select,greatest-n-per-group,Mysql,Sql,Join,Select,Greatest N Per Group,我正在尝试为每个用户查询最新的汽车: select * from users left join (select cars.* from cars where cars.userid=users.userid order by cars.year desc limit 1) as cars on cars.userid=users.userid where子句中似乎显示了未知列users.userid 我试图删除cars.u
select * from users
left join
(select cars.* from cars
where cars.userid=users.userid
order by cars.year desc limit 1) as cars
on cars.userid=users.userid
where子句中似乎显示了未知列users.userid
我试图删除cars.userid=users.userid部分,但它只获取一辆最新的汽车,并将其粘贴到每个用户
有没有办法完成我的目标?谢谢 也许有更好更有效的方法来查询这个问题。这是我的解决方案
select users.userid, cars.*
from users
left join cars on cars.userid = users.userid
join (SELECT userid, MAX(year) AS maxDate
FROM cars
GROUP BY userid) as sub on cars.year = sub.maxDate;
一个选项是使用子查询过滤左连接:
select * -- better enumerate the columns here
from users u
left join cars c
on c.userid = u.userid
and c.year = (select max(c1.year) from cars c1 where c1.userid = c.userid)
关于性能,考虑CARUSERID,年.< /P>的索引。
请注意,如果您有重复的userid,则这可能会为每个用户返回多辆车。最好有一个真实的日期,而不仅仅是年份。为此,我通常使用行号:
请您发布创建表和一些数据,以便我们更好地理解您的问题,请参见代码问题中给出的剪切粘贴和可运行代码,包括作为代码输入的最小代表性示例;期望和实际输出,包括逐字记录错误消息;标签和版本;清晰的说明和解释。尽可能少地给出代码,即显示为OK的代码,并通过显示为not OK的代码进行扩展。调试基础。对于包含DBMS和DDL(包括约束和索引)的SQL,请输入格式化为表的代码。暂停对总体目标的工作,将代码切碎到第1个表达式,不给出您期望的内容,说出您期望的内容和原因。嘿,谢谢您的回答,但它看起来每个用户返回的汽车不止一辆。嘿,谢谢您的回答。我发现SQL语法中有```错误。。。near'partitionby c.userid order by c.year desc as seqnum from cars c``这很好用!非常好的解决方案,我不认为在join语句中使用AND。谢谢!看起来也很快
select *
from users u left join
(select c.* , row_number() over (partition by c.userid order by c.year desc) as seqnum
from cars c
) c
on c.userid = u.userid and c.seqnum = 1;