Mysql 在表1结果不匹配的地方加入表2

Mysql 在表1结果不匹配的地方加入表2,mysql,join,Mysql,Join,我有一个小桌子,上面有foo/bar这样的路径 我有一个大的table2,上面有完整的URL,如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, '/', '\\/'

我有一个小桌子,上面有foo/bar这样的路径

我有一个大的table2,上面有完整的URL,如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
具有NOT IN的子查询可能会有所帮助,但我不确定如何使用第一个查询的结果路径:

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

如何解决这个问题?

您可以像这样使用子查询

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

但是正如Gordon Linoff已经指出的,您的数据不适合快速加入。此查询将很慢,因为使用字符串的LIKE操作非常昂贵。

您不能这样做。您的数据不适合快速联接。因此,请分别查询路径?的每个结果。MySQL不提供对部分字符串匹配作为连接条件的有效支持。谢谢。对于表1中的20k行和表2中的250k行,需要11秒。更正:如CONCAT“%”,t1.path“%”