Pertanyaan Menemukan perpotongan antara dua kolom


Saya mencoba mencari persimpangan (set) antara dua kolom di tabel yang sama di MySQL. Saya pada dasarnya ingin mencari baris yang memiliki a col1 elemen yang ada di tabel col2, atau a col2 elemen yang ada di tabel col1.

Awalnya saya mencoba:

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

yang secara sintaksis valid, namun waktu berjalannya terlalu tinggi. Jumlah baris dalam tabel adalah ~ 300.000 dan dua kolom yang dimaksud adalah tidak diindeks. Saya berasumsi waktu berjalan n ^ 2 atau n ^ 3 tergantung pada apakah MySQL menjalankan subquery lagi untuk setiap elemen tabel atau jika menyimpan hasil subquery sementara.

Selanjutnya saya berpikir untuk mengambil penyatuan dari dua kolom dan menghapus elemen yang berbeda, karena jika sebuah elemen muncul lebih dari satu kali dalam penyatuan ini maka harus ada di kedua kolom (dengan asumsi kedua kolom hanya mengandung elemen yang berbeda).

Apakah ada cara yang lebih elegan (yaitu lebih cepat) untuk menemukan set persimpangan antara dua kolom dari tabel yang sama?


5
2018-06-03 20:01


asal


Jawaban:


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

Menciptakan indeks col1 dan col2 akan pergi jauh untuk membantu permintaan ini juga.


11
2018-06-03 20:03



Jika Anda hanya menginginkan nilai, coba INTERSECT perintah:

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

-1
2017-12-05 17:55