Подскажите по запросу MySQL

12
Allality
На сайте с 15.05.2010
Offline
75
899

Есть таблица с несколькими столбцами однотипных данных: stolb_p, stolb_m, stolb_r, stolb_k и т.д.

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

Я в MySQL не профи, могу реализовать только с помощью нескольких простых запросов, но это приведет к нагрузке на сервер БД.

Можно ли осуществить задуманное одни-двумя запросами? Если да, то как?

Буду благодарен за любые советы. :)

М
На сайте с 08.02.2006
Offline
59
#1

В information_schema.COLUMNS содержится информация о названиях столбцов.

minor
На сайте с 04.10.2010
Offline
70
#2
Я в MySQL не профи, могу реализовать только с помощью нескольких простых запросов, но это приведет к нагрузке на сервер БД.

Обычно на оборот разбивают сложные запросы на несколько простых, как вы узнали что это приводит к нагрузки на сервер?

PHP experience 2 year, comprehend seo
Exillon
На сайте с 30.01.2008
Offline
94
#3

Allality Почитай про объединения в mysql - LEFT JOIN например.

minor Зачем делать лишние запросы в скриптах когда можно сделать одним? MYSQL заточен чтобы обрабатывать сложные запросы, пускай он и занимается этим, а не делать множество ненужных мелких запросов из скрипта.

Перехват доменов с ТИЦ и PR, Списки дроп доменов. (https://dropwind.com/exp_domains) Регистрация доменов net-7.66$, com-8.30$, org-5.99. Хостинг от 1.24$. (https://dropwind.com/) wm BL 750+
minor
На сайте с 04.10.2010
Offline
70
#4
Зачем делать лишние запросы в скриптах когда можно сделать одним?

Зависит от ситуации, один большой запрос трудно читать разработчикам, куча джойнов медленнее работает чем отдельные запросы опять же от ситуации не всегда.

Allality
На сайте с 15.05.2010
Offline
75
#5

Посмотрел про JOIN, вроде как он для нескольких таблиц используется. У меня одна таблица, с несколькими столбцами...

lstaticl
На сайте с 07.02.2008
Offline
82
#6

Аццкий запрос:


SELECT * FROM `table` WHERE stolb_p LIKE '%searchword%' OR stolb_m LIKE '%searchword%' OR stolb_r LIKE '%searchword%' OR stolb_k LIKE '%searchword%';
Хочу выиграть MacBook (http://contest.adkeeper.ru)
Allality
На сайте с 15.05.2010
Offline
75
#7
lstaticl:

SELECT * FROM `table` WHERE stolb_p LIKE '%searchword%' OR stolb_m LIKE '%searchword%' OR stolb_r LIKE '%searchword%' OR stolb_k LIKE '%searchword%';

Уже ближе к телу. А как сказать PHP в каком столбце находится найденная строка?

Sano000
На сайте с 12.04.2009
Offline
54
#8

while ($row = mysql_fetch_assoc($result)) {

foreach($row as $key=>$data)
{
if(strpos($data, $searched_value)
return $key; /* поле */
}
}

Это отвратительное решение с точки зрения производительности. Лучше использовать пара отдельных запросов, тем более находя вхождение не будут выполнятся лишние запросы. И не забываем что like очень медленно работает.

Программирование было хобби - стало серьезной работой
Allality
На сайте с 15.05.2010
Offline
75
#9
Sano000:

Это отвратительное решение с точки зрения производительности. Лучше использовать пара отдельных запросов, тем более находя вхождение не будут выполнятся лишние запросы. И не забываем что like очень медленно работает.

Вы говорите про решение, которое было выше или про то, которое у вас в цитате? Есть ли способ сделать это без лишней нагрузки на сервер? Дело в том, что этот код будет исполняться при загрузке каждой страницы, а хостинг - обычный shared...

Sano000
На сайте с 12.04.2009
Offline
54
#10

Я предложил как определить поле для примера выше. Но сам по себе путь не правильный.

А как сделать правильно зависит от того что вы хотите.

Если вам нужен поиск, который инициирует пользователь, то в таком случае нагрузка на сервер будет в целом небольшая, можно использовать решение с одним сложным запросом или разбить запрос на несколько мелких. Так же, чтоб обезопасить себя от ДДОСа надо на поиск установить капчу и прикрутить механизм ограничения запросов при определенной нагрузке.

Если же инициировать запрос будет ваш скрипт при загрузке определенных страниц сайта, то в таком случае проблем с производительностью не избежать. Лучше или отказаться от задуманного, либо получше продумать и перестроить структуру БД, либо создать специальные служебные таблицы с индексами и искать в них по средством '=', а не 'like'.

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий