【问题标题】:Join table2 where table1 result doesn't match在 table1 结果不匹配的地方加入 table2
【发布时间】:2017-09-15 11:41:06
【问题描述】:

我有一个小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

如何解决?

【问题讨论】:

  • 你不能。您的数据不适合快速join
  • 那么单独的查询或路径的每个结果?
  • 。 . MySQL 不提供对部分字符串匹配作为连接条件的有效支持。

标签: mysql join


【解决方案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

但正如 Gordon Linoff 已经指出的那样,您的数据不适合快速连接。这个查询会很慢,因为LIKE 对字符串的操作非常昂贵。

【讨论】:

  • 谢谢。 table1 中的 20k 行和 table2 中的 250k 行需要 11 秒。更正:LIKE CONCAT('%', t1.path, '%')
猜你喜欢
  • 1970-01-01
  • 2018-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-30
  • 2016-07-18
相关资源
最近更新 更多