菜鸟请教一条 sql 急急急 谢谢各位大佬了?

表a id name apply_id
1 李四 1
2 张三 2

表b
id time money apply_id
1 2018-01-30 2000 1
2 2018-06-29 200 1
3 2019-07-30 300 1
4 2018-06-31 3232 2
结果如下 假设当前时间为 2018-06-30日 需求一对多获取子表日期距离当前日期最近的一条数据
李四 2018-06-29 300
张三 2018-06-31 3232

可以有偿解决

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
最佳答案

@阿伦 怎么把缩进吞了,sql 看起来好乱。重发一下

SELECT name,time,money FROM
    a
LEFT JOIN
    (
        SELECT * FROM
            (SELECT time,money,apply_id FROM b ORDER BY ABS(DATEDIFF(NOW(),time)) ASC) bb
        GROUP BY apply_id
    ) bbb
ON a.apply_id=bbb.apply_id

但是如果同 apply_id 存在日期之差相同的两条记录的话,就只能取出一条了

5年前 评论
讨论数量: 15

@阿伦 怎么把缩进吞了,sql 看起来好乱。重发一下

SELECT name,time,money FROM
    a
LEFT JOIN
    (
        SELECT * FROM
            (SELECT time,money,apply_id FROM b ORDER BY ABS(DATEDIFF(NOW(),time)) ASC) bb
        GROUP BY apply_id
    ) bbb
ON a.apply_id=bbb.apply_id

但是如果同 apply_id 存在日期之差相同的两条记录的话,就只能取出一条了

5年前 评论

@阿伦 mysql 5.7以上版本 order by在字查询无效

5年前 评论
yangyuan 4年前
你看我吊吗啊

子表是B ? 给时间time倒序 不就完事了 ,取第一条数据 。

5年前 评论

@JeffLi 倒序拿的是 时间最大的一条 我要的是距离当前时间最近的一条啊 老哥

5年前 评论
你看我吊吗啊

@Mr_Guo 时间最大的 难道不是距离当前时间最近的吗。。除非你指定离某个时间点最近的时间。。

5年前 评论
chenshuai
  1. 场景应该是: 获取用户最近的一条消费记录吧
  2. 当前日期 是想表达 小于当前的时间戳是吗?
  3. b.time 加普通索引, where time < 当前时间戳 , desc , limit 1
5年前 评论

@chenshuai 不是啊 老哥 唯一的条件就是当前时间最近的一条记录 不管大于当前时间 还是小于当前时间

5年前 评论

SET @counter=0;
select * from ( select @counter:=@counter+1 as rank, a.name,b.time,b.money,a.apply_id from a left join b on a.apply_id=b.apply_id order by ABS(NOW() - b.time) asc ) as aa group by apply_id

1.当前时间跟b表中的时间 进行相减 拿出绝对值之后 按照正序排列
2.需要设置一个 计数器来使得 顺序不乱
3.group by 取出

5年前 评论

在Laravel很好实现,
假设表a: UserApply, 表b:Apply
在UserApply Model:public function applies() { return $this->hasMany(Apply::class, 'apply_id', 'apply_id')}
Controller:
UserApply::with(['applies' => function($query) { $query->orderBy('time','desc')->first() }])->get();

5年前 评论

感觉有点儿行不通啊, 当前时间最近的一条记录, 当前时间是 6-30 号, 那么它怎么能在6-31号有记录呢?
mysql 的if 能解决么?

5年前 评论

SELECT name,time,money FROM
a
LEFT JOIN
(
SELECT * FROM
(SELECT time,money,apply_id FROM b ORDER BY ABS(DATEDIFF(NOW(),time)) ASC) bb
GROUP BY apply_id
) bbb
ON a.apply_id=bbb.apply_id

5年前 评论

@Mr_Guo 那如果 你找到解决方案的话 可以 发出来 让我学习一下

5年前 评论

@zxx123 select from (select from (SELECT *, ABS( loan_repay_plan.should_time - 2018-06-22 ) AS btime FROM loan_repay_plan ORDER BY btime ASC) as bb GROUP BY bb.loan_no) as c left join loan_user_info as user on c.loan_no = user.`loan_no 这条sql 性能也不好 但是凑合用吧

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!