There are a number of ways to get the result you are after, given that the permutations are always made up of (1,2,2).
The simplest is to create a table containing the permutuations:
create table perm ( `int1` int, `int2` int, `int3` int );
insert into perm values (1,2,2), (2,1,2), (2,2,1);
Another is to take your existing joins, and restrict the answers to the set of valid permutations:
select distinct
x1.int1 as a,
x2.int1 as b,
x3.int1 as c
from x1
JOIN x2
JOIN x3
WHERE (a=1 and b=2 and c=2)
OR (a=2 and b=1 and c=2)
OR (a=2 and b=2 and c=1);
Another is to add the permutations table into the join:
select distinct
x1.int1 as a,
x2.int1 as b,
x3.int1 as c
from x1
JOIN x2
JOIN x3
JOIN perm p on p.`int1` = a and p.`int2` = b and p.`int3` = c
Another approach would be to join against table x1 twice more, ensuring that every row in x1 appears in each result:
select distinct
c1.int1 as a,
x2.int1 as b,
x3.int1 as c
from x1 as c1
JOIN x2
JOIN x3
JOIN x1 as c2 on c2.`int1` = b and c2.`int1` != c1.`int1` and c2.`int1` != c3.`int1`
JOIN x1 as c3 on c3.`int1` = c and c3.`int1` != c1.`int1` and c3.`int1` != c2.`int1`
... but this will not work given that value 2 appears in x1 twice. Some unique per-row value would be needed to distinguish one row containing 2 from another.
The permutation table is easiest.