我有一个问题,我想知道我是否可以解决我的mysql查询。
我的数据库中有一个“名字”列表:
id=1, name="name1"
id=2, name="name11"
id=3, name="name111"
我想在db中获取名称的id,并在开头添加最常见的字符。
=> name111someignorechar would return 3
=> name11someignorechar would return 2
=> name1someignorechar would return 1
有什么想法吗?
如果我使用LIKE关键字, SELECT id FROM names WHERE CONCAT(name,“%”)LIKE“name111someignorechar” 它将返回3个结果!
答案 0 :(得分:1)
试试这个:
select name
from names
where 'name111someignorechar' like concat(name,'%')
order by length(name) desc
limit 1
答案 1 :(得分:1)
目前的答案确实适用于OP提供的示例,但它并没有真正回答这个问题。 OP请求按最常见字符排序的查询,但只有当DB条目包含搜索查询中的字符子集时,查询才有效,仅此而已。
例如,将 name111someignorechar 与 name1otherignorechar 进行比较是行不通的。
还有另一种解决方案,如下所述: 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