当您在MySQL工作台中具有联合键时,如何引用另一行?

时间:2019-07-02 21:35:44

标签: mysql mysql-workbench

我在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

谢谢!

2 个答案:

答案 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