Нахождение пересечения между двумя столбцами - PullRequest
5 голосов
/ 04 июня 2011

Я пытаюсь найти (установить) пересечение между двумя столбцами в одной таблице в MySQL. Я в основном хочу найти строки, которые имеют либо элемент col1 , который находится в таблице col2 , либо элемент col2 , который находится в таблице col1 .

Первоначально я пытался:

SELECT * FROM table WHERE col1 IN (SELECT col2 FROM table)

, что было синтаксически допустимым, однако время выполнения слишком велико. Количество строк в таблице составляет ~ 300 000, а два рассматриваемых столбца не проиндексированы . Я предполагаю, что время выполнения равно n ^ 2 или n ^ 3, в зависимости от того, выполняет ли MySQL подзапрос снова для каждого элемента таблицы или если он временно сохраняет результат подзапроса.

Затем я подумал о том, чтобы взять объединение двух столбцов и удалить отдельные элементы, потому что, если элемент появляется в этом объединении более одного раза, он должен присутствовать в обоих столбцах (при условии, что оба столбца содержат только отдельные элементы).

Существует ли более элегантный (то есть более быстрый) способ найти пересечение множеств между двумя столбцами одной таблицы?

Ответы [ 2 ]

11 голосов
/ 04 июня 2011
SELECT t1.*
    FROM table t1
        INNER JOIN table t2
            ON t1.col1 = t2.col2

Создание индексов для col1 и col2 также поможет этому запросу.

0 голосов
/ 05 декабря 2016

Если вам нужны только значения, попробуйте команду INTERSECT:

(SELECT col1 FROM table) INTERSECT (SELECT col2 FROM table)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...