SQL LIKE поиск точного совпадения

Добрый день, такой вот вопрос.

Есть 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 мая 2017, 10:40
modx.pro
2
6 119
0

Комментарии: 19

Виталий
19 мая 2017, 13:43
0
Ох уж этот SQL, на данный момент никакие манипуляция с LIKE не привели к желаемому результату…
    Олег
    19 мая 2017, 13:45
    0
    SQL работает корректно, по такой строке нормально не выбрать число.
    Либо можно сделать обертку всего поля из запятых, будет выглядеть так: ,2,10 2,22, 5,22, и выбирать оттуда ,2,
      Виталий
      19 мая 2017, 13:49
      0
      Сепарировать не вариант с разделителями. Возможно можно как-то разбить поиск столбца на подстроки? Проверить левую часть и правую на строгое соответствие, у нас же есть запятая которая разделяет числа? Приложил скрин к тикету, может так понятнее будет…
        Олег
        19 мая 2017, 13:57
        0
        WHERE u.id LIKE '%,?{$var}%,?'
        Попробуй вот так, допускает запятую по бокам от переменной.
        А, нет, не поможет.
        Вместо запятой могут быть и другие символы.

        В общем попробуй через регулярки, может и получится.
        Я в таких случаях делал обертку значения.
          Виталий
          19 мая 2017, 14:00
          0
          Других символов быть не может, но запрос не сработал.
          Конструкция такая: число, число
            Олег
            19 мая 2017, 14:03
            0
            По моему варианту ищется переменная, по бокам от которой допускаются запятые. Но нет ничего про то, что вместо переменной не может быть число.
            WHERE u.id LIKE '%[^0-9]{$var}[^0-9]%'
            Вот так можно попробовать, ищет переменную и исключает цифры вокруг нее.
              Виталий
              19 мая 2017, 14:23
              0
              Да не, не то. ХЗ че делать
                Олег
                19 мая 2017, 14:25
                0
                Какой формируется SQL запрос?
                {$var} точно заменяется? То, что я скинул должно работать.
                  Виталий
                  19 мая 2017, 14:28
                  0
                  WHERE u.id LIKE '%[^0-9]4[^0-9]%' ORDER BY m.timestamp ASC
                  Не работает, увы

                  Какой нибудь аналог explode в php :)
                  Разбить на подстроки и проверить слева и справа.

                  И самое главное, нужно полное соответствие, те 2 != 22 или 4 != 444
                    Олег
                    19 мая 2017, 14:31
                    0
                    Такого нет, насколько я знаю.
                    Только регулярки — обычно они помогают такие проблемы решить.
                    WHERE u.id LIKE '%[^0-9]?4[^0-9]?%' ORDER BY m.timestamp ASC
                    Вот так еще можно попробовать.
                      Виталий
                      19 мая 2017, 14:33
                      0
                      Не, не работает. Эх…

                      Я уже и такую конструкцию попробовал:
                      WHERE u.id LIKE '%{$var},%' OR u.id LIKE '%,{$var}%'
                      Но как я уже и писал выше, он выдает все, что находит.
                      Иными словами мы ищем айдишник 2, а он находит 2 и 22 и 225 и тд

                      У LIKE нет никакого оператора типа =?
                      Виталий
                      19 мая 2017, 14:47
                      0
                      В общем ничего лучше не придумал как сделать вот так…
                      Да простят меня Боги SQL. Может быть кто-то потом, что-то по-лучше посоветует.

                      WHERE u.id LIKE '{$var},%' OR u.id LIKE '%,{$var}'
                      Олег
                      19 мая 2017, 14:54
                      0
                      Да, в принципе вполне себе вариант. Не очень красивый, но, главное, работающий.
                      Алексей Ерохин
                      19 мая 2017, 17:22
                      0
                      WHERE u.id REGEXP CONCAT('[[:<:]]', '{$var}', '[[:>:]]')
                      Означает начало и конец слова.
Олег
19 мая 2017, 13:44
0
Сделай обертку по бокам от значений — навроде значение 2, а в бд сохраняется |2|
Тогда будет: |2|,|10 2|,|22|,| 5|,|22|
    Дмитрий Кондаков
    19 мая 2017, 17:49
    0
    так не работает?
    WHERE u.id RLIKE '(^|,){$var}(,|$)'
      Сергей Шлоков
      19 мая 2017, 18:35
      +2
      FIND_IN_SET
        Виталий
        20 мая 2017, 15:27
        0
        Ну прям вообще по красоте
        WHERE FIND_IN_SET({$var}, u.id)
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      19