2012-03-03 93 views
2

我有一个问题我想知道如果我可以解决我的MySQL查询。Mysql:找到大多数匹配起始字符的字符串

我在DB“名称”列表: id=1, name="name1" id=2, name="name11" id=3, name="name111"

我想获得这个名字的ID在DB与在开始时最常见的字符。

=>name111someignorechar would return 3

=>name11someignorechar would return 2

=>name1someignorechar would return 1

任何想法?

如果我使用LIKE关键字 SELECT id FROM names WHERE CONCAT(name,“%”)LIKE“name111someignorechar” 它会将3个结果返回给我!

+1

WHERE LIKE“%名称1%” – 2012-03-03 12:24:02

+0

名您是否希望返回3,2和1或者是你试图返回名称=“”即或不同的值的内容? – kaj 2012-03-03 12:29:37

回答

1

试试这个:

select name 
from names 
where 'name111someignorechar' like concat(name,'%') 
order by length(name) desc 
limit 1 
1

目前的答案做工作的OP已经给出的例子,但它并没有真正回答这个问题。 OP要求按最常见字符排序的查询,但只有在数据库条目包含搜索查询中字符的子集时才适用查询,仅此而已。

例如,name1otherignorechar是行不通的比较name111someignorechar

还有另一种解决方案,为这里解释: http://tech-q-a.tumblr.com/post/58713827644/how-to-sort-results-based-on-the-number-of-identical

我们可以使用MySQL的函数计算的数量相同的起始字符为两个字符串:

DROP FUNCTION IF EXISTS countMatchingBeginChars; 
delimiter // 
CREATE FUNCTION `countMatchingBeginChars`(s1 text, s2 text) RETURNS int(11) 
    DETERMINISTIC 
BEGIN 
    DECLARE s1_len, s2_len, min_len, j INT; 
    SET s1_len = LENGTH(s1), s2_len = LENGTH(s2); 

    IF s1_len > s2_len THEN 
     SET min_len = s2_len; 
    ELSE 
     SET min_len = s1_len; 
    END IF; 
    SET j = 0; 
    WHILE j <= min_len DO 
     SET j = j + 1; 
     IF SUBSTRING(s1,j,1) != SUBSTRING(s2,j,1) THEN 
      RETURN j-1; 
     END IF; 
    END WHILE; 
    RETURN min_len; 
END// 
delimiter ; 

所以,

SELECT countMatchingBeginChars("name111someignorechar", "name11") 

会返回6(如上),但是

现在
SELECT countMatchingBeginChars("name111someignorechar", "name11otherignore") 

,我们可以根据匹配的字符数在数据库中的条目进行排序:

SELECT name FROM names ORDER BY countMatchingBeginChars("name111someignorechar",name) DESC, name 

如果只需要最匹配的字符的输入,我们就可以只返回一个结果。

SELECT name FROM names ORDER BY countMatchingBeginChars("name111someignorechar",name) DESC, name LIMIT 1