首页 > 解决方案 > MYSQL用连接表中的值填充行空白 - 随机空格

问题描述

我有两张桌子,一张是主图像行,另一张是备用图像。

主表...

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

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

谢谢

标签: mysqlsql

解决方案


鉴于这些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. 但是,我留在了参考文献中,所以逻辑更清晰。


推荐阅读