Как получить все возможные комбинации среди строк одной и той же таблицы

#mysql #sql

#mysql #sql

Вопрос:

Мне нужна комбинация строк из одной и той же таблицы. Возможно ли это? Вот моя таблица :

 CREATE TABLE `ta` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) NULL DEFAULT NULL,
PRIMARY KEY (`id`)
)


INSERT INTO `ta` (`id`, `name`) VALUES 
(1, 'ta1'),
(2, 'ta2'),
(3, 'ta3'),
(4, 'ta4');
  

Результат должен быть таким, как показано ниже :

 |    ta1 |    ta2 |
|    ta1 |    ta3 |
|    ta1 |    ta4 |
|    ta2 |    ta3 |
|    ta2 |    ta4 |
|    ta3 |    ta4 |
  

или

 |    ta1 |    ta2 |
|    ta1 |    ta3 |
|    ta1 |    ta4 |
|    ta2 |    ta1 |
|    ta2 |    ta3 |
|    ta2 |    ta4 |
|    ta3 |    ta1 |
|    ta3 |    ta2 |
|    ta3 |    ta4 |
|    ta4 |    ta1 |
|    ta4 |    ta2 |
|    ta4 |    ta3 |
  

Комментарии:

1. Выберите self join x.name , y.name ИЗ ta x ПРИСОЕДИНИТЬСЯ К ta y НА x.id < y.id

Ответ №1:

Вам нужно сделать CROSS JOIN между двумя экземплярами вашей таблицы ta , скажем A amp; B

 SELECT 
 A.name,
 B.name FROM ta A CROSS JOIN ta B 
WHERE A.id <> B.id
  

Смотрите демо

Примечание:

Если вы рассматриваете <a,b> and <b,a> записи по-разному, то приведенного выше запроса будет достаточно.

И если вам нужна только одна запись для каждой пары, где порядок не имеет значения (т. Е. <a,b> is equal to <b,a>) тогда вместо этого примите следующее:

 SELECT 
 A.name,
 B.name FROM ta A CROSS JOIN ta B 
WHERE A.id < B.id
  

Ответ №2:

Выполните самосоединение:

 SELECT t1.name, t2.name
FROM ta t1
    JOIN ta t2 ON t1.id < t2.id