2010-11-06 228 views
2

在MySQL可以匹配「12684041234」的最長前綴你會做最長前綴匹配

SELECT num_prefix 
FROM nums 
WHERE '12684041234' LIKE CONCAT(num_prefix, '%') 
AND LENGTH(num_prefix) = (
    SELECT MAX(LENGTH(num_prefix)) 
    FROM nums 
    WHERE '12684041234' LIKE CONCAT(num_prefix, '%') 
) 

nums有一個前綴值命名爲num_prefix列。

我該怎麼做蜂巢?

+0

我認爲你當前的SQL查詢並不是最有效的方法,因爲它需要全表掃描。績效會成爲一個問題? – 2010-11-06 07:50:09

+0

@Mark Byers:表現不是問題。這是一個批處理作業,前綴表不是很大(幾百個),如果需要,我可以緩存結果 – Eyal 2010-11-06 15:10:45

回答

6

這是我如何做到這一點在MySQL:

SELECT num_prefix FROM nums 
    WHERE '12684041234' LIKE CONCAT(num_prefix,'%') 
    ORDER BY num_prefix DESC 
    LIMIT 1 
; 

這會給最長前綴(ORDER BY .. DESC),只有一個行(LIMIT 1)。

+0

這會導致性能極差。該條件永遠不能在num_prefix上使用索引,因此此查詢將始終需要全表掃描。 這是多一點努力,但你可以搜索WHERE num_prefix IN(12684041234,1268404123,126840412,12684041,1268404,126840,12684,1268,126,12,1)。 – steveayre 2013-08-02 08:00:42

+0

雖然我自己沒有驗證過,但據報道,如果您引用數字,查詢速度將快大約22倍。 WHERE num_prefix IN('12684041234','1268404123','126840412','12684041','1268404','126840','12684','1268','126','12','1') 來源:http://wiki.freeswitch.org/wiki/Mod_lcr – steveayre 2013-08-02 08:04:40