Если вы используете MySQL 8+, тогда мы можем использовать ROW_NUMBER
здесь:
WITH cte AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY main_id ORDER BY id) rn
FROM yourTable
)
SELECT
ROW_NUMBER() OVER (ORDER BY main_id) id,
main_id,
MAX(CASE WHEN rn = 1 THEN image END) AS image1,
MAX(CASE WHEN rn = 2 THEN image END) AS image2,
MAX(CASE WHEN rn = 3 THEN image END) AS image3,
MAX(CASE WHEN rn = 4 THEN image END) AS image4
FROM cte
GROUP BY
main_id;
![enter image description here](https://i.stack.imgur.com/b7YR9.png)
Демо