簡體   English   中英

MySQL左側加入CONCAT通配符

[英]MySQL LEFT JOIN ON LIKE CONCAT Wildcard

我有一個包含來自我們網站的不同信息的數據庫。 一個表(稱為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, '(')
                 );

子查詢可能使用索引。 我不確定會。

如果兩個表中的path字段的值相同,則可以使用:

SELECT * 
FROM Raw_Pages AS R
LEFT JOIN Paths AS P ON (R.path=P.path)
WHERE R.ID IS NULL

如果僅與頁面名稱或路線名稱匹配

SELECT * 
FROM Raw_Pages AS R
LEFT JOIN Paths AS P ON (R.path LIKE CONCAT('%',P.path,'%'))
WHERE R.ID IS NULL

您可以檢查此頁面以驗證所需的查詢類型

優良作法是對兩個表中的路徑字段都建立索引,以便由於記錄數而使查詢更快

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM