我有一个小的table1,其路径如foo/bar
。
我有一个大表2,其中包含https://www.google.com/foo/bar/
等完整网址。
我想选择table1路径,这些路径在table2中的完整URL中不存在。
我尝试使用REGEXP进行JOIN,但查询速度很慢,我可能选择了错误的连接:
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
如何解决这个问题?
答案 0 :(得分:1)
您可以将子查询与此{/ 1}}一起使用
LIKE
但正如Gordon Linoff已经指出的那样,您的数据不适合快速加入。此查询将很慢,因为使用字符串的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
操作非常昂贵。