【问题标题】:MySQL left join fill with previous value if null如果为空,则 MySQL 左连接填充先前的值
【发布时间】:2016-02-23 13:45:47
【问题描述】:

假设我有两张桌子

表A:

ID - Value1
===========
1  - A
2  - B
3  - C
4  - D

表B:

ID - Value2
===========
1  - AA
3  - NULL
4  - DD

这些表的正常连接可能是:
选择 * 来自 TableA TA 左连接表 B TB ON TA.ID = TB.ID

结果将是:

ID - Value1 - Value2
======================
1  - A - AA
2  - B - NULL
3  - C - NULL
4  - D - DD

但是,在我的情况下,我想用前一行的值填充 NULL 值(实际上缺少该值)并保留实际为 NULL 的值,如下所示:

ID - Value1 - Value2
======================
1  - A - AA
2  - B - AA
3  - C - NULL
4  - D - DD

有没有办法做到这一点?

编辑 1: 我意识到我的问题问错了……抱歉给您带来了困惑。

实际上,如果连接的表有一个实际为NULL的值,我想保留,如果该值不存在,则填充该值。

【问题讨论】:

    标签: mysql left-join


    【解决方案1】:
    SELECT TA.ID, TA.Value1, 
           if(isnull(Value2), @n, (@n:=Value2)) Value2 
        FROM TableA TA 
           LEFT JOIN 
             TableB TB 
           ON TA.ID = TB.ID 
           cross join(select @n:='') n
    

    demo on sqlfiddle

    【讨论】:

    • 我已经更新了我的问题...错过了一件重要的事情。对不起!
    【解决方案2】:

    尝试这样的事情 - 内部左连接是为表 b 中的每个值获取前一个非空值(如果存在),然后将其连接到表 a,如果不为空或新值则取 value2如果是的话。

    SELECT f.id,f.value1,coalesce(p.value2,p.PrevValue2) as value2
    FROM TableA f
    LEFT OUTER JOIN(SELECT t.ID,t.Value2,
                                (select s.value2 from tableB s
                                 where s.value2 is not null and s.id<t.id
                                 order by s.id DESC limit 1) as PrevValue2 
                    FROM TableB t) p
    ON(p.id = f.id)
    

    【讨论】:

    • 我已经更新了我的问题...错过了一件重要的事情。对不起!
    • 我担心的是连接表(在本例中为 TableB)将保存时间序列数据和潜在的数十亿行。 ID 当然是一个索引,但仍然......我应该担心......吗?
    • 这似乎并没有削减它,或者我在实施它时可能做错了什么。还是谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-23
    • 1970-01-01
    • 2015-03-05
    相关资源
    最近更新 更多