LIKE наоборот

Тема в разделе "Базы данных", создана пользователем Dark Wizard, 26 май 2015.

Статус темы:
Закрыта.
Модераторы: latteo
  1. Dark Wizard

    Dark Wizard

    Регистр.:
    23 сен 2007
    Сообщения:
    153
    Симпатии:
    76
    Добрый день,

    подскажите, пожалуйста, по работе SQL запроса. Никак не получается составить, хотя переписываю один в один из примеров.

    Требуется: выбрать все записи из таблицы portal_role_groups где введённый мною id включает в себя значение idrange из таблицы. Например, я даю id = 1234567, мне нужно найти записи с idrange = 123

    Пробовал по-разному модифицировать запросы:
    Код:
    SELECT * FROM portal_role_groups WHERE position(idrange IN '214748364789') > 0;  
    
    SELECT * FROM portal_role_groups WHERE "214748364789" LIKE CONCAT( idrange, "%");
    
    Но не работает - или выводит все записи с пустым idrange, или с не пустым.
     
  2. nejtr0n

    nejtr0n Постоялец

    Регистр.:
    24 янв 2014
    Сообщения:
    95
    Симпатии:
    38
    Включает полностью? Или частично?
     
  3. Dark Wizard

    Dark Wizard

    Регистр.:
    23 сен 2007
    Сообщения:
    153
    Симпатии:
    76
    как это частично?)
    Введённый мною id 1234567 с клавиатуры полностью включает и начинается с 123 (кол-во цифр и сами цифры могут быть другие) из записей в базе.
     
  4. nejtr0n

    nejtr0n Постоялец

    Регистр.:
    24 янв 2014
    Сообщения:
    95
    Симпатии:
    38
    Это число откуда берется?
    Лучше пример строки из таблицы.
     
  5. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.403
    Симпатии:
    1.185
    Создал табличку и проверил, оба ваши запроса сработают, если в таблице есть поле с idrange 214 или 2147 или 21474 и т.п.
    Уверены что в вашей таблице есть такие записи?
     
    Последнее редактирование: 26 май 2015
  6. Black Hat

    Black Hat Постоялец

    Регистр.:
    15 май 2015
    Сообщения:
    107
    Симпатии:
    69
    Подтверждаю запросы работают правильно, дело в другом.
    Как вариант использовать RLIKE:
    SELECT "123456789" RLIKE '123456'; -- 1
    SELECT "123456789" RLIKE '000000'; -- 0
    Правда
    SELECT "123456789" RLIKE '456'; -- 1
     
  7. Dark Wizard

    Dark Wizard

    Регистр.:
    23 сен 2007
    Сообщения:
    153
    Симпатии:
    76
    Всем спасибо, оказалось что дело в типе столбца (был varchar), и он показывал при поиске также все пустые значения. В итоге сделал так:

    Код:
    SELECT * FROM portal_role_groups WHERE (position(idrange IN '".$userid."') > 0) AND idrange <> '' ORDER BY CHAR_LENGTH(idrange) DESC LIMIT 1;
     
Статус темы:
Закрыта.