下面這個例子查詢將讓你使用MySQL指定的結果集,但它並沒有真正做到「模糊匹配」,至少,這不是我會怎樣形容算法。 (這實現您所描述的算法。 - 通過值進行排序,然後檢查每個值,以查看是否引導部分「匹配」一個以前提取的值)
此發現的「完全匹配」龍頭部的鄰域值與以前檢索到的值相比較,但實際上並沒有任何有關匹配的「模糊性」。
當查詢遇到一個「不匹配」的值時,它表示該值爲「不匹配」。對於下一個檢索的值,它會檢查該值是否以先前的「不匹配」值開始;如果字符串的前導部分完全匹配,則丟棄該值。否則,該值被標記爲「不匹配」的值,並被保留。
此方法使用內聯視圖(或「派生表」,因爲MySQL引用它們)。最內層的內聯視圖(別名爲s)爲我們提供了一個用於鄰域的不同值的排序列表。 「訣竅」(如果你想這樣稱呼的話)在下一個內聯視圖中(別名爲「t」),我們利用MySQL用戶變量引用先前檢索的值。
爲了避免出現任何關於「特殊字符」的問題,我們對主要字符進行了平等比較。
這裏是整個查詢:
SELECT t.neighborhood
FROM (
SELECT IF(IFNULL(LEFT(s.neighborhood,CHAR_LENGTH(@match)) <> @match,1),@match := s.neighborhood,NULL) AS neighborhood
FROM (SELECT RTRIM(neighborhood) AS neighborhood
FROM mytable
JOIN (SELECT @match := NULL) r
GROUP BY neighborhood
ORDER BY neighborhood
) s
) t
WHERE t.neighborhood IS NOT NULL
這一切真的很簡單,除了@match變量的初始化,執行當前值與先前值進行比較的表達。
如果我們不通過特殊字符中的值引入的極端情況而言,我們可以用一個簡單的LIKE或REGEXP做比較:
s.neighborhood NOT LIKE CONCAT(@match,'%')
s.neighborhood NOT REGEXP CONCAT('^',@match)
LIKE運算受下劃線和字符百分比,REGEXP受制於在正則表達式中使用的特殊字符。爲了避免這些問題,上面的查詢使用的比較可知更是一個有點笨拙尋找:
LEFT(s.neighborhood,CHAR_LENGTH(@match)) <> @match
那是什麼做的是以前的值(例如@match:=「公園景觀」)和比較,爲的領導部分(直到'Park View'的長度)下一個值,確定它是否匹配。
這個查詢方法的一個好處是保證返回的值在後續查詢中的謂詞中匹配。假設您使用此查詢來獲取鄰居列表,並且用戶選擇了一個。這將返回一組將與每一行「匹配」的值。
後續查詢可以使用簡單謂詞(WHERE子句)中的任何返回值來返回匹配的行。例如,如果用戶選擇了值「大明湖」:
SELECT t.*
FROM mytable t
WHERE LEFT(t.neighborhood,CHAR_LENGTH('Great Lake') = 'Great Lake'
在我們使用相同或REGEXP謂詞相匹配的情況下,我們就需要使用相應的匹配中的謂語後續查詢:
SELECT t.*
FROM mytable t
WHERE t.neighborhood LIKE CONCAT('Great Lake','%')
SELECT t.*
FROM mytable t
WHERE t.neighborhood REGEXP CONCAT('^','Great Lake')
你可以添加輸出需要你的問題,以更好地理解..? – heretolearn
是「Sub X」唯一的字符串,它將在最後,還是該文本變量? –
@sshekhar:「'只返回」Park View「和」Great Lake「。」 - 這是預期的輸出。 – Travesty3