2011-06-03 85 views
5

我試圖找到MySQL中同一個表中兩列之間的交集。基本上,我想找到有一張COL1元素是表中的COL2,或COL2元素是表中的COL1行。查找兩列之間的交點

起初我想:

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

這是語法上有效,但在運行時是高得離譜。表中的行數是〜300,000,所涉及的兩列是未編入索引。我假設運行時間爲n^2或n^3,具體取決於MySQL是否爲表的每個元素再次執行子查詢,或者是否暫時存儲子查詢的結果。

接下來我想到了兩列的聯合並刪除不同的元素,因爲如果一個元素在這個聯合中出現不止一次,那麼它必須出現在兩列中(假設兩列只包含不同的元素) 。

是否有更優雅(即更快)的方式來查找同一個表的兩列之間的集交集?在col1col2

+0

從未使用'SELECT X FROM表,其中科利IN(SELECT ...)''的IN(SELECT'查詢是慢如地獄在MySQL中,總是使用內部連接,如@joe所示 – Johan 2011-06-03 21:27:47

回答

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

創建索引會很長的路要走,以幫助這個查詢也是如此。

+0

它工作的很好,謝謝!事實證明,其中一列**是索引:D – alott 2011-06-10 02:48:00

-1

如果你只想要的值,請嘗試INTERSECT命令:

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