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            
                            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.