powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Пересечение множеств на основе данных из второго столбца
3 сообщений из 3, страница 1 из 1
Пересечение множеств на основе данных из второго столбца
    #38450477
_undefined
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем дня.
У меня вопрос в студию - как я могу получить пересечение множеств для таблицы с именем test:
+-------------+
| col1 | col2 |
+-------------+
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 1 | 4 |
| 1 | 5 |
| 1 | 6 |
| 2 | 7 |
| 3 | 12 |
| 4 | 9 |
| 4 | 1 |
| 4 | 2 |
| 5 | 11 |
| 6 | 30 |
| 7 | 2 |
| 8 | 1 |
+-------------+

Допустим, я говорю -- давай мне все пересечения для "col1 со значением 1" с остальными из столбца col1 на основе данных из столбца col2. Таким образом я должен получить все значения col1(кроме самого "col1 1") которые имеют схожие с "col1 1" значения в поле col2:


(1,2,3,4,5,6)

2:(7) ∩ 3:(12) ∩ 4:(9,1,2) ∩ 5:(11) ∩ 6:(30) ∩ 7:(2) ∩ 8:(1)

в итоге, пересекаются всего 3 значения из 7 находящиеся в col1:

4:(1,2)
7:(2)
8:(1)

В БД на выходе:
+------+
| col1 |
+------+
| 4 |
| 7 |
| 8 |
+------+

Мне нужны только первые 10 строк (но самые релевантные -- с самым большим количеством пересечений).
Желательно производительное решение, так как таких строк может быть от сотен тысяч до десятка миллионов.

Идеи?
...
Рейтинг: 0 / 0
Пересечение множеств на основе данных из второго столбца
    #38450497
qwerty112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_undefined,

Код: sql
1.
2.
3.
4.
5.
6.
7.
select t1.col1
from T t1 inner join T t2 on t1.col2=t2.col2
where t1.col1<>1
  and t2.col1=1
group by t1.col1
order by count(/* distinct */ t1.col2) desc
limit 10
...
Рейтинг: 0 / 0
Пересечение множеств на основе данных из второго столбца
    #38450543
_undefined
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Огромное Вам спасибо за помощь!

Вот еще решение:

<code>
SELECT t2.col1, COUNT(*) int_size, GROUP_CONCAT(t2.col2)
FROM test t1
JOIN test t2 ON t1.col2 = t2.col2
WHERE t1.col1 = 1
AND t2.col1 != 1
GROUP BY t2.col1
ORDER BY int_size DESC
LIMIT 10

</code>
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Пересечение множеств на основе данных из второго столбца
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]