菜鸟请教一条 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

可以有偿解决

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案

@阿伦 怎么把缩进吞了,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
你看我吊吗啊

子表是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年前 评论

@阿伦 怎么把缩进吞了,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年前 评论

@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年前 评论

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

5年前 评论
yangyuan 4年前

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