[英]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.