- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Тренды маркетинга в 2024 году: мобильные продажи, углубленная аналитика и ИИ
Экспертная оценка Адмитад
Оксана Мамчуева
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Здравствуйте.
На странице имеется массив $arr, небольшой, не более пяти элементов.
Надо проверить каждый элемент на совпадение в поле description таблицы БД и вывести результаты, если совпадения найдены.
Совпадение частичное, типа "SELECT * FROM table WHERE description LIKE '%bla-bla%' "
Циклы небольшие, 3-5 элементов массива проверяются в таблице из 300 строк..., может и ничего страшного... но везде в обсуждениях категорически не рекомендуют загонять запросы в цикл.
Как я понимаю, если бы искать точное сопадение, подошёл бы оператор IN(), чтобы одним запросом проверить все элементы массива.
Не пробовал, но должно работать по идее "SELECT * FROM table WHERE description IN($arr) ", если не напутал с кавычками...
А как быть с частичным совпадением?
Можно ли как то объединять операторы IN и LIKE %%
В один запрос. Табличка то одна. Когда ваша табличка попадет в оперативку, гонять по ней операторы уже нормально, отдельными запросами вы увеличиваете немного другие вещи.
Надо запомнить, что все операции можно переложить на БД и в 90% случаев она это сделает быстрее, чем вы на php
А как же потом разделять?
В качестве param1, param2 будут элементы массива и каждому должен соответствовать свой desc
А потом в тексте происходит подмена элементов массива ссылками на файл.
У меня сейчас так работает:
Работает нормально, но хотелось бы запрос отдельно от цикла...
Работает нормально, но хотелось бы запрос отдельно от цикла...
Как только перестанет работать, начнете думать. Если все сделать по феншую, то во-первых, пройдет 100 лет, во-вторых, ничего не будет работать. Оптимизировать нужно там, где тормозит, а не там где кто то на форуме написал.
Вместо %LIKE% вам лучше сделать FULLTEXT на столбец и поиск делать через MATCH … AGAINST. В разы быстрее будет.
А цикл оставляйте, если он нужен.
Индексами ещё не пользовался... пробую...
FULLTEXT на столбец.... Не получается... phpMyAdmin пишет ошибку #1170 - BLOB/TEXT column 'text' used in key specification without a key length
Надо размер максимальный задать для столбца.
Тип поля выставлен text. Длина/значения - пусто. Что туда вписать?
---------- Добавлено 16.02.2017 в 17:20 ----------
как я понял запрос должен выглядеть примерно так:
SELECT name,desc,text FROM table WHERE MATCH(desc) AGAINST('.$ic0.')
Определить сколько символов у вас используется в этом столбце и вписать с запасом число. Потом проставить полный индекс.
Да.
ОК.
Индекс FULLTEXT встал.
Теперь попробую поменять запрос.
---------- Добавлено 16.02.2017 в 17:50 ----------
Работает. По скорости так сходу не могу судить... Верю на слово, ибо сам с индексами никогда не работал.. слышал лишь что существенно ускоряется поиск в таблице.
Тип столбца поменял на varchar(255), мне там длины хватит.
Спасибо, парни, за помощь!