2017-09-15 110 views
0

我有一個小型table1,其路徑類似於foo/bar加入table2其中table1結果不匹配

我有一個很大的table2與像https://www.google.com/foo/bar/完整的網址。

我想選擇table1路徑,它不存在於table2的完整URL中。

我試圖用一個REGEXP加入,但查詢是很慢的,我可能選擇了錯誤的連接:

SELECT t1.path 
FROM table1 AS t1 
RIGHT JOIN `table2` AS t2 
     ON (REPLACE(t1.path, '/', '\\/') REGEXP ".+" + t2.url + ".*") 
WHERE t1.path != "" 
ORDER BY t1.id DESC 
LIMIT 10 

與不能在子查詢可能有幫助,但我不知道如何使用第一個查詢的結果路徑:

SELECT path 
FROM `table1` 
WHERE path != "" 
    NOT IN (
      SELECT url FROM `table2` WHERE url LIKE "%" + [path of query 1] + "%" 
      ) 
ORDER BY id DESC 
LIMIT 10 

如何解決這個問題?

+0

你不能。您的數據不適合快速加入。 –

+0

那麼單獨的查詢或路徑的每個結果? – Martin

+1

。 。 MySQL不提供對連接條件部分字符串匹配的有效支持。 –

回答

1

您可以使用子查詢與LIKE這樣

SELECT path 
FROM `table1` 
WHERE TRIM(path) <> '' 
    AND NOT EXISTS (
      SELECT url FROM `table2` WHERE url LIKE CONCAT('%', t1.path, '%') 
      ) 
ORDER BY id DESC 
LIMIT 10 

但由於戈登·利諾夫已經指出,對於一個快速連接你的數據不適合。這個查詢會很慢,因爲使用字符串的LIKE操作非常昂貴。

+1

謝謝。表1中的20k行和表2中的250k行需要11秒。更正:'LIKE CONCAT('%',t1.path,'%')' – Martin

相關問題