我在MySQL工作台中的代码
SELECT
id,
user_id,
parent_id,
approved_time,
@new_approved_t:=IF(new_product_type != 'B', approved_time, @new_approved_t))AS new_approved_time
FROM p
运行代码后,我的数据框如下所示:
id user_id parent_id product_type approved_time New_approved_time
30 11 NA A 8/4/2017 8/4/2017
31 11 30 B 12/1/2017 8/4/2017
54 5 NA A 5/5/2018 5/5/2018
322 5 54 B 7/22/2018 5/5/2018
21 5 NA C 8/1/2018 8/1/2018
13 5 NA C 8/2/2018 8/2/2018
2445 5 NA C 9/25/2018 9/25/2018
111 44 NA A 10/4/2018 10/4/2018
287 44 111 B 10/8/2018 10/4/2018
211 33 NA A 12/5/2018 12/5/2018
277 33 211 B 12/25/2018 12/5/2018
1120 33 NA C 1/1/2019 1/1/2019
1389 33 211 B 1/11/2019 1/1/2019
我希望所有product_type以'B'结尾,并且new_approved_time列使用相应的parent_id批准时间。结果应如下所示:
id user_id parent_id product_type approved_time New_approved_time
30 11 NA A 8/4/2017 8/4/2017
31 11 30 B 12/1/2017 8/4/2017
54 5 NA A 5/5/2018 5/5/2018
322 5 54 B 7/22/2018 5/5/2018
21 5 NA C 8/1/2018 8/1/2018
13 5 NA C 8/2/2018 8/2/2018
2445 5 NA C 9/25/2018 9/25/2018
111 44 NA A 10/4/2018 10/4/2018
287 44 111 B 10/8/2018 10/4/2018
211 33 NA A 12/5/2018 12/5/2018
277 33 211 B 12/25/2018 12/5/2018
1120 33 NA C 1/1/2019 1/1/2019
1389 33 211 B 1/11/2019 12/5/2018 <-this is where I dont know how to write my code
谢谢!
答案 0 :(得分:0)
由于父级(pp)具有其自己的值,因此需要这样的自连接。由于加入条件,对于非B产品,pp.approved_time
将为NULL
。
SELECT
p.id,
p.user_id,
p.parent_id,
p.approved_time,
COALESCE(pp.approved_time, p.approved_time) AS new_approved_time
FROM p
LEFT JOIN p AS pp ON p.new_product_type = 'B' AND p.parent_id = pp.id
答案 1 :(得分:0)
在这里找到了一个解决方案,其中包含我在示例中未包括的另一列,但基本上与上面列出的parent_id列相反,该列仅在product_type A中列出了id,其余列为null。
但是我从Dan关于COALESCE()函数的代码中得到了提示,谢谢Dan。
CASE WHEN c.new_product_type IN ('A', 'B') THEN @new_approved_t:=IF(COALESCE(if((a.is_loc=1 AND b.ploc_RID IS NOT NULL), a.id, null)), a.approved_time, @new_approved_t)
ELSE a.approved_time END AS new_approved_time