Mysql INSTR помогает искать только 1 строку, которая соответствует больше текста - PullRequest
1 голос
/ 05 октября 2019

У меня есть столовая с полевым кодом

code
BED 6 
BED 6 DEM

У меня есть текст для поиска, например, "... BED 6 DEM ..."

Если я сделаю SELECT * FROM room WHERE INSTR('... BED 6 DEM ...',code) >0

Я получаю эти 2 строки:

code
BED 6 
BED 6 DEM

Но я хотел бы получить только 1: BED 6 DEM

Иногда мне просто нужно SELECT * FROM room WHERE INSTR('... BED 6 ...',code) >0

и получите только 1 строку

code
BED 6

с ок в порядке

Любое предложение, чтобы всегда получить только лучший ряд совпадений?

1 Ответ

1 голос
/ 05 октября 2019

Вы можете отсортировать результаты по убыванию длины совпавшей строки и получить только первый результат:

SELECT *
FROM room r 
WHERE INSTR('... BED 6 DEM ...', code) > 0
ORDER BY CHAR_LENGTH(code) DESC
LIMIT 1

Другой вариант - использовать условие NOT EXISTS с коррелированным подзапросом для сопоставления с самым длинным,содержит искомую строку, например:

SELECT * 
FROM room r 
WHERE INSTR('... BED 6 DEM ...', code) > 0
AND NOT EXISTS (
    SELECT 1
    FROM room r1
    WHERE 
        INSTR('... BED 6 DEM ...', r1.code) > 0
        AND CHAR_LENGTH(r1.code) > CHAR_LENGTH(r.code)
)
...