Заполнение строки в MYSQL значениями из объединенной таблицы - случайные пробелы - PullRequest
0 голосов
/ 13 октября 2018

У меня есть две таблицы, одна с рядами основных изображений и другая с альтернативными изображениями.

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

Эти две таблицы объединены идентификатором.Каков наилучший способ заполнить пустые значения в main_table альтернативными изображениями из alt_images_table?Я подумал о том, чтобы, возможно, выполнить подсчет полей в строке, а затем рассмотреть вопрос о заполнении изображений в следующем числовом поле.

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

Но это будет много кода для настройки.Я просто не уверен, что есть лучший способ.Пока что все, о чем я думаю, в коде кажется чрезмерным.Между основными изображениями никогда не бывает пробелов.Их количество варьируется в каждой строке, как показано в примере.

Спасибо

1 Ответ

0 голосов
/ 13 октября 2018

Учитывая, что все значения 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.Тем не менее, я оставил в ссылках, чтобы логика была яснее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...