2011-06-03 21 views
5

Estoy tratando de encontrar la intersección (conjunto) entre dos columnas en la misma tabla en MySQL. Básicamente quiero buscar las filas que tienen ya sea un elemento decol1 que está en col2 de la tabla, o un elemento decol2 que está en col1 de la tabla.Encontrar la intersección entre dos columnas

principio me trataron:

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

que era sintácticamente válida, sin embargo, el tiempo de ejecución es demasiado alta. El número de filas en la tabla es ~ 300,000 y las dos columnas en cuestión son no indexadas. Supongo que el tiempo de ejecución es n^2 o n^3 dependiendo de si MySQL ejecuta la subconsulta de nuevo para cada elemento de la tabla o si almacena temporalmente el resultado de la subconsulta.

Luego pensé en tomar la unión de las dos columnas y eliminar elementos distintos, porque si un elemento aparece más de una vez en esta unión, entonces debe haber estado presente en ambas columnas (suponiendo que ambas columnas contengan solo elementos distintos) .

¿Existe alguna manera más elegante (es decir, más rápida) de encontrar la intersección establecida entre dos columnas de la misma tabla?

+0

nunca use 'Select X de la tabla donde Coly IN (SELECT ...)' El IN (consulta 'SELECT' es lento como el infierno en MySQL, siempre use una combinación interna como se muestra en @joe. – Johan

Respuesta

11
SELECT t1.* 
    FROM table t1 
     INNER JOIN table t2 
      ON t1.col1 = t2.col2 

Creación de índices en col1 y col2 que recorrer un largo camino para ayudar a esta consulta también.

+0

Funciona muy bien, ¡gracias! Y resultó que una de las columnas ** estaba ** indexada: D – alott

-1

Si sólo desea que los valores, a intentar el mandato INTERSECT:

(SELECT col1 FROM table) INTERSECT (SELECT col2 FROM table) 
Cuestiones relacionadas