У меня есть 2 оператора SELECT, которые предполагают сделать так, чтобы количество совпадающих соответствий напрямую соответствовало значению char_length столбца «input». Так, например:
if (char_length(input) <= 5) { matches required is 1 } if (char_length(input) > 5 && char_length(input) <= 10) { matches required is 2 } if (char_length(input) > 10 && char_length(input) <= 15) { matches required is 3 } and ect...
Однако это не так. Он выбирает строку до тех пор, пока существует совпадение, независимо от длины символов в строке. Вот мой код:
SELECT @limit :=0; SELECT input, response, ( input LIKE '% one %' ) AS matches, @limit := @limit +1 FROM allData WHERE @limit < CEIL( CHAR_LENGTH( input ) /5 ) HAVING matches >0 AND matches = ( SELECT MAX( ( input LIKE '% one %' ) ) FROM allData ) LIMIT 30 ;
Так, например:
Столбец: input: пример строки "what superpower would you have for one day"
^ — это будет выбрано только в случае 8 совпадений, потому что 42/5 = 8.4.
42 – длина символа строки выше. Это должно быть выбрано только там, если есть 8 совпадений. Однако было только одно совпадение – слово «один», и все же оно было выбрано в любом случае. Я не уверен, что я сделал не так. Пожалуйста, взгляните на мой код.
Получен отмеченный дубликат. Это не дублирует. Там, где я получил ответ, от которого не получается.
MySQL не имеет встроенной функции, которая учитывает вхождения строки в столбце. Обходной путь – это формула:
(CHAR_LENGTH(column) - CHAR_LENGTH(replace(column, @string, '')))/CHAR_LENGTH(@string)
replace(column, @string, ''))
возвращает значение столбца при @string
всех вхождений @string
. Когда вы вычитаете эту длину из длины полного столбца, вы получаете длину всех повторений строки. Деление на длину строки приводит к количеству вхождений. Таким образом, ваш запрос должен быть:
SELECT input, response, (CHAR_LENGTH(input) - CHAR_LENGTH(replace(input, 'one', '')))/CHAR_LENGTH('one') AS matches FROM allData HAVING matches >= CEIL(CHAR_LENGTH(input)/5)
DEMO