He hecho algo similar al tratar listas de ID separadas por comas para emular máscaras de bits. El truco es hacer una unión usando como '%, id,% (donde id es la clave en una tabla indexada por id). Para su caso, uno table_1 a una tabla de enteros secuenciados y el resultado incluye una fila para cada id en su columna product_id.
Hago esto una vez por cada ID que solicita y me uno a las tablas derivadas resultantes para encontrar las comunes.
Aquí está la consulta:
SELECT p1.id, p1.name name1,p2.name name2, GROUP_CONCAT(p1.N) similarities
FROM (
SELECT *
FROM table_1 t1
JOIN sequence8 s8 on CONCAT(',',t1.product_ids,',') LIKE CONCAT('%,',s8.N,',%')
WHERE t1.id =1
) p1
JOIN
(
SELECT *
FROM table_1 t1
JOIN sequence8 s8 ON CONCAT(',',t1.product_ids,',') LIKE CONCAT('%,',s8.N,',%')
WHERE t1.id =4
) p2 ON p2.n = p1.n
GROUP BY p1.id