SQL LIKE поиск точного совпадения
Добрый день, такой вот вопрос.
Есть SQL запрос, проблема с WHERE
Есть записи, вида: 2,10 2,22 5,22
В итоге SQL запрос возвращает все 3 записи, т.к. 2 встречается во всех 3 записях, а нужно чтобы возвращалась, только 1-я запись. Как задать строгий режим соответствия?
Решение:
Есть SQL запрос, проблема с WHERE
WHERE u.id LIKE '%{$var}%'
Допустим перменная {$var} равна = 2. Есть записи, вида: 2,10 2,22 5,22
В итоге SQL запрос возвращает все 3 записи, т.к. 2 встречается во всех 3 записях, а нужно чтобы возвращалась, только 1-я запись. Как задать строгий режим соответствия?
Решение:
WHERE FIND_IN_SET({$var}, u.id)
Комментарии: 19
Ох уж этот SQL, на данный момент никакие манипуляция с LIKE не привели к желаемому результату…
SQL работает корректно, по такой строке нормально не выбрать число.
Либо можно сделать обертку всего поля из запятых, будет выглядеть так: ,2,10 2,22, 5,22, и выбирать оттуда ,2,
Либо можно сделать обертку всего поля из запятых, будет выглядеть так: ,2,10 2,22, 5,22, и выбирать оттуда ,2,
Сепарировать не вариант с разделителями. Возможно можно как-то разбить поиск столбца на подстроки? Проверить левую часть и правую на строгое соответствие, у нас же есть запятая которая разделяет числа? Приложил скрин к тикету, может так понятнее будет…
WHERE u.id LIKE '%,?{$var}%,?'
Попробуй вот так, допускает запятую по бокам от переменной.А, нет, не поможет.
Вместо запятой могут быть и другие символы.
В общем попробуй через регулярки, может и получится.
Я в таких случаях делал обертку значения.
Других символов быть не может, но запрос не сработал.
Конструкция такая: число, число
Конструкция такая: число, число
По моему варианту ищется переменная, по бокам от которой допускаются запятые. Но нет ничего про то, что вместо переменной не может быть число.
WHERE u.id LIKE '%[^0-9]{$var}[^0-9]%'
Вот так можно попробовать, ищет переменную и исключает цифры вокруг нее.
Да не, не то. ХЗ че делать
Какой формируется SQL запрос?
{$var} точно заменяется? То, что я скинул должно работать.
{$var} точно заменяется? То, что я скинул должно работать.
WHERE u.id LIKE '%[^0-9]4[^0-9]%' ORDER BY m.timestamp ASC
Не работает, увыКакой нибудь аналог explode в php :)
Разбить на подстроки и проверить слева и справа.
И самое главное, нужно полное соответствие, те 2 != 22 или 4 != 444
Такого нет, насколько я знаю.
Только регулярки — обычно они помогают такие проблемы решить.
Только регулярки — обычно они помогают такие проблемы решить.
WHERE u.id LIKE '%[^0-9]?4[^0-9]?%' ORDER BY m.timestamp ASC
Вот так еще можно попробовать.
Не, не работает. Эх…
Я уже и такую конструкцию попробовал:
Иными словами мы ищем айдишник 2, а он находит 2 и 22 и 225 и тд
У LIKE нет никакого оператора типа =?
Я уже и такую конструкцию попробовал:
WHERE u.id LIKE '%{$var},%' OR u.id LIKE '%,{$var}%'
Но как я уже и писал выше, он выдает все, что находит.Иными словами мы ищем айдишник 2, а он находит 2 и 22 и 225 и тд
У LIKE нет никакого оператора типа =?
В общем ничего лучше не придумал как сделать вот так…
Да простят меня Боги SQL. Может быть кто-то потом, что-то по-лучше посоветует.
Да простят меня Боги SQL. Может быть кто-то потом, что-то по-лучше посоветует.
WHERE u.id LIKE '{$var},%' OR u.id LIKE '%,{$var}'
Да, в принципе вполне себе вариант. Не очень красивый, но, главное, работающий.
WHERE u.id REGEXP CONCAT('[[:<:]]', '{$var}', '[[:>:]]')
Означает начало и конец слова.
Сделай обертку по бокам от значений — навроде значение 2, а в бд сохраняется |2|
Тогда будет: |2|,|10 2|,|22|,| 5|,|22|
Тогда будет: |2|,|10 2|,|22|,| 5|,|22|
так не работает?
WHERE u.id RLIKE '(^|,){$var}(,|$)'
FIND_IN_SET
Ну прям вообще по красоте
WHERE FIND_IN_SET({$var}, u.id)
А ещё лучше
WHERE FIND_IN_SET({$var}, u.id) > 0
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.