Zrobiłem coś podobnego, traktując listy oddzielonych przecinkami identyfikatorów, aby emulować maski bitowe. Sztuczka polega na wykonaniu sprzężenia za pomocą '%,id,% (gdzie id jest kluczem w tabeli indeksowanej przez id). W Twoim przypadku łączę table_1 z tabelą sekwencyjnych liczb całkowitych, a wynik zawiera wiersz dla każdego identyfikatora w kolumnie product_id.
Robię to raz dla każdego identyfikatora, o który prosisz, i dołączam do wynikowych tabel pochodnych, aby znaleźć te wspólne.
Oto zapytanie:
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