Перечисление комбинаций через SQL - PullRequest
1 голос
/ 10 февраля 2012

У меня есть такая таблица:

ID | name
=================================
 1 | apple
 1 | bear
 2 | cactus
 2 | dog
 2 | apple
 3 | apple
 3 | dog
==================================

и я хочу получить следующий уникальный набор комбинаций для каждого идентификатора в качестве вывода из запроса SQL:

===================
apple  | bear
apple  | cactus
apple  | dog
cactus | dog
===================

По сути, это тип транспонирования. В идеале я хотел бы расширить это, чтобы включить число сопутствующих обстоятельств, например:

===================
1 | apple  | bear
1 | apple  | cactus
2 | apple  | dog
1 | cactus | dog
===================

но это может быть выше и выше. Я знаю, что могу выполнить все вышеперечисленное, используя хранимый процесс; было просто любопытно, могу ли я сделать это как запрос.

Подойдет любой SQL, но MySQL будет предпочтительнее, если это возможно.

Спасибо за любой вклад!

Ответы [ 2 ]

2 голосов
/ 10 февраля 2012

Из вашего примера похоже, что вы хотите, чтобы первый столбец содержал все, что name идет первым в алфавитном порядке, поэтому я использовал < при присоединении таблицы к себе.

select count(*), t1.Name, t2.Name
from 
    tblThings t1 join
    tblThings t2 ON t1.ID = t2.ID AND t1.Name < t2.Name
group by t1.Name, t2.Name

И вот запрос в действии, чтобы доказать, что я не сумасшедший.

0 голосов
/ 10 февраля 2012

Ваш первый шаг - получить список комбинаций.

SELECT * FROM names n1 
INNER JOIN names n2 ON n1.id = n2.id 
WHERE n1.name < n2.name;

Это даст

1|apple|1|bear
2|cactus|2|dog
2|apple|2|cactus
2|apple|2|dog
3|apple|3|dog

Ваш следующий шаг - РАСЧЕТ уникальных комбинаций name1, name2.

SELECT COUNT(1), name1, name2
FROM (
  SELECT n1.name AS name1, n2.name AS name2
  FROM names n1 INNER JOIN names n2 ON n1.id = n2.id
  WHERE n1.name < n2.name) x 
GROUP BY name1, name2

Что дает

1|apple|bear
1|apple|cactus
2|apple|dog
1|cactus|dog
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...