By using db<>fiddle, you agree to license everything you submit by Creative Commons CC0.
CREATE TABLE test (id INT, col1 VARCHAR(255), col2 VARCHAR(255), col3 VARCHAR(255));
INSERT INTO test VALUES
(1, 'Иванов', 'Иван', 'Иванович'),
(2, 'Иван', 'Иванович', 'Иванов'),
(3, 'Петров', 'Сергей', 'Алексеевич'),
(4, 'Петров', 'Сергей', 'Алексеевич'),
(5, 'Сергей', 'Алексеевич', 'Петров');
SELECT * FROM test;
id | col1 | col2 | col3 |
---|---|---|---|
1 | Иванов | Иван | Иванович |
2 | Иван | Иванович | Иванов |
3 | Петров | Сергей | Алексеевич |
4 | Петров | Сергей | Алексеевич |
5 | Сергей | Алексеевич | Петров |
WITH
cte1 AS ( SELECT id, col1 val FROM test UNION ALL
SELECT id, col2 FROM test UNION ALL
SELECT id, col3 FROM test ),
cte2 AS ( SELECT id, GROUP_CONCAT(val ORDER BY val) FIO
FROM cte1
GROUP BY id )
SELECT test.id, test.col1, test.col2, test.col3, GROUP_CONCAT(cte2_2.id) ids
FROM test
JOIN cte2 cte2_1 USING (id)
JOIN cte2 cte2_2 USING (FIO)
GROUP BY test.id, test.col1, test.col2, test.col3
id | col1 | col2 | col3 | ids |
---|---|---|---|---|
1 | Иванов | Иван | Иванович | 1,2 |
2 | Иван | Иванович | Иванов | 1,2 |
3 | Петров | Сергей | Алексеевич | 3,4,5 |
4 | Петров | Сергей | Алексеевич | 3,4,5 |
5 | Сергей | Алексеевич | Петров | 3,4,5 |