Mysql: найти строку с наиболее подходящими начальными символами - PullRequest
2 голосов
/ 03 марта 2012

У меня есть проблема, которую я хотел бы знать, могу ли я решить мой запрос mysql.

У меня есть список "имен" в моей БД: id=1, name="name1" id=2, name="name11" id=3, name="name111"

Я хотел бы получить идентификатор имени в дБ с наиболее распространенными символами в начале.

=> name111someignorechar would return 3

=> name11someignorechar would return 2

=> name1someignorechar would return 1

Есть идеи?

Если я использую ключевое слово LIKE, ВЫБЕРИТЕ ИД ИЗ ИМЕН, ГДЕ CONCAT (name, "%") LIKE "name111someignorechar" Вернетсямне 3 результата!

Ответы [ 2 ]

1 голос
/ 20 августа 2013

Текущий ответ работает для примера, который дал ОП, но на самом деле он не отвечает на вопрос. ОП запрашивает запрос, упорядочивающий по наиболее распространенным символам, но этот запрос работает только в том случае, если запись БД содержит подмножество символов в поисковом запросе и ничего более.

Например, сравнение name111someignorechar с name1otherignorechar не будет работать.

Есть другое решение, как описано здесь: http://tech -q-a.tumblr.com / запись / 58713827644 / как к сортировки результатов на основе-на-число-тождественны

Мы можем использовать функцию 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
1 голос
/ 19 января 2013

Попробуйте это:

select name
from names
where 'name111someignorechar' like concat(name,'%')
order by length(name) desc
limit 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...