MYSQL用连接表中的值填充行空格-随机空格

时间:2018-10-13 01:07:59

标签: mysql sql

我有两个表,一个表包含主图像行,另一个表具有备用图像。

main_table ...

id      |    image1  |    image2  |    image3   |   image4   |  image5  |
__________________________________________________________________________

3498    | main-1.jpg | main-2.jpg |  NULL       |  NULL      |  NULL
3476    | main-1.jpg | main-2.jpg |  NULL       |  NULL      |  NULL 
3034    | main-1.jpg | NULL       |  NULL       |  NULL      |  NULL
3698    | main-1.jpg | main-2.jpg |  main-3.jpg |  NULL      |  NULL

alt_images_table ........

id      |    alt_image1  |    alt_image2  |  alt_image3
_________________________________________________________________________

3498    | alt-1.jpg      | alt-2.jpg      |  alt-3.jpg
3476    | alt-1.jpg      | alt-2.jpg      |  NULL
3034    | alt-1.jpg      | NULL           |  NULL
3698    | alt-1.jpg      | alt-2.jpg      |  alt-3.jpg

这两个表由ID联接。用alt_images_table中的alt图像填充main_table中的NULL的最佳方法是什么?我想过可能要在行中计算一个计数字段,然后再将一个图像填充到下一个数字字段中。

SET image3=
CASE
WHEN image1 is not NULL and image2 IS NOT NULL THEN alt_image1......etc.....etc....
END

但这将设置很多代码。我只是不确定是否有更好的方法。到目前为止,我在想的一切似乎都超出了代码的范围。主图像之间永远不会有空白。如示例所示,它们的数量在每一行中都不同。

谢谢

1 个答案:

答案 0 :(得分:1)

鉴于null值都在末尾,您可以使用case来表达逻辑:

update maintable m join
       alt_images ai
       on m.id = ai.id
    set m.image1 = coalesce(m.image1, a.alt_image1),
        m.image2 = (case when m.image1 is null then a.alt_image2
                         when m.image2 is null then a.alt_image1
                         else m.image2
                    end),
        m.image3 = (case when m.image1 is null then a.alt_image3
                         when m.image2 is null then a.alt_image2
                         when m.image3 is null then a.alt_image1
                         else m.image3
                    end),
        m.image4 = (case when m.image1 is null then a.alt_image4
                         when m.image2 is null then a.alt_image3
                         when m.image3 is null then a.alt_image2
                         when m.image4 is null then a.alt_image1
                         else m.image4
                    end),
        m.image4 = (case when m.image1 is null then a.alt_image5
                         when m.image2 is null then a.alt_image4
                         when m.image3 is null then a.alt_image3
                         when m.image4 is null then a.alt_image2
                         when m.image5 is null then a.alt_image1
                         else m.image5
                    end);

我意识到alt_images的图像数量不及maintable。但是,我保留了参考资料,因此逻辑更加清晰。