我有一个包含来自我们网站的不同信息的数据库。一个表(称为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/

10-13 01:02