我有一个包含来自我们网站的不同信息的数据库。一个表(称为Raw_Pages)包含我们站点上每个页面的列表以及它的路径(当然还有其他字段)。另一个表(称为路径)包含由不同部门拥有的站点的各个分支的列表。
我正在尝试运行一个查询,以基本上找到该站点上不属于指定分支之一的所有页面。
table Raw_Pages
+-------------------------+--------------+
| Field | Type |
+-------------------------+--------------+
| ID | int(11) |
| Path | varchar(500) |
| Title | varchar(255) |
+-------------------------+--------------+
table Paths
+----------+--------------+
| Field | Type |
+----------+--------------+
| ID | int(11) |
| Path | varchar(255) |
+----------+--------------+
目前,我们正在针对757个路径检查64002页(由于不同文件类型的不同,所有部门都有多个分支)。我还计划对文件进行类似的查询,其中有306,625个文件,并从757个路径的同一列表中提取。是的,我们的网站非常混乱。
据我所知,在左侧使用通配符的情况下,LEFT JOIN最适合我。我是代码新手,所以我可能相距甚远。
SELECT * FROM Raw_Pages LEFT JOIN Paths ON Raw_Pages.path LIKE CONCAT(Paths.Path,'%') WHERE Paths.ID IS NULL
老实说,我不确定上面的代码是否有效,因为它在我尝试时只会冻结phpMyAdmin。我假设其中有问题,或者有更好的方法。
谢谢!
最佳答案
如果在Paths(Path)
上有索引,则可以执行以下操作:
select rp.*
from raw_pages rp
where not exists (select 1
from paths p
where p.path <= rp.path and
p.path > concat(rp.path, '(')
);
子查询可能使用索引。我不确定会。
关于mysql - MySQL左侧加入CONCAT通配符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57861033/