Количество различных установленных значений конечно.Так что это должно работать:
SELECT * FROM records1, records2
WHERE (rcords2.id=1200) and (
((FIND_IN_SET('12', records1.set) > 0) and (FIND_IN_SET('12', records2.p) > 0)) or
((FIND_IN_SET('14', records1.set) > 0) and (FIND_IN_SET('14', records2.p) > 0)) or
((FIND_IN_SET('60', records1.set) > 0) and (FIND_IN_SET('60', records2.p) > 0)) or
((FIND_IN_SET('80', records1.set) > 0) and (FIND_IN_SET('80', records2.p) > 0)) or
...
)
А также возможны двоичные операции, если наборы обеих таблиц определены одинаково (в одинаковом порядке):
select * from records1, records2
where (rcords2.id=1200) and (records1.set & records1.set);
Это работаеттолько если оба столбца имеют тип набора ('12 ',' 14 ',' 60 ',' 80 ', ...)
Если это список, разделенный запятыми, в строковом поле, то sql-оператор может выглядеть следующим образом:
SELECT * FROM records1, records2
WHERE (records2.id=1200) and (
(CONCAT(",", records2.p, ",") like CONCAT("%,", substring_index(substring_index(records1.set, ',', 1), ',', -1), ",%")) or
(CONCAT(",", records2.p, ",") like CONCAT("%,", substring_index(substring_index(records1.set, ',', 2), ',', -1), ",%")) or
(CONCAT(",", records2.p, ",") like CONCAT("%,", substring_index(substring_index(records1.set, ',', 3), ',', -1), ",%")) or
(CONCAT(",", records2.p, ",") like CONCAT("%,", substring_index(substring_index(records1.set, ',', 4), ',', -1), ",%")) or
...
(CONCAT(",", records2.p, ",") like CONCAT("%,", substring_index(substring_index(records1.set, ',', N), ',', -1), ",%"))
)
Если строковое поле имеет тип varchar (X), то в этом поле меньше, чем X / 2 возможных значений, поэтому замените N на X / 2 в моем SQL-выражении.