Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 子查询左连接引用父ID_Mysql_Sql_Join_Select_Greatest N Per Group - Fatal编程技术网

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;