Перейти к содержимому


Вычисление, чтобы удалить 1 слово из всех записей в таблице


Сообщений в теме: 7

#1 d654525

    Активный участник

  • Пользователи
  • PipPipPip
  • 90 сообщений

Отправлено 28 Июнь 2017 - 12:41

помогите сделать допдействие с sql запросом к бд.

мне нужно у всех записей в поле $line['f3751'] таблицы 341 убрать слово " язык" (с пробелом перед словом)

в выпадающем списке я меняю значения (убираю слово язык, чтобы было просто английский, немецкий...). у существующих записей чтобы убрать, нужно только sql запрос выполнить, т.к. в этом поле можно выбрать несколько значений и простым массовым редактированием не вывернуться

#2 maksn

    Активный участник

  • Пользователи
  • PipPipPip
  • 314 сообщений
  • Пол:Мужчина

Отправлено 28 Июнь 2017 - 15:14

Просмотр сообщенияd654525 (28 Июнь 2017 - 12:41) писал:

помогите сделать допдействие с sql запросом к бд.

мне нужно у всех записей в поле $line['f3751'] таблицы 341 убрать слово " язык" (с пробелом перед словом)

в выпадающем списке я меняю значения (убираю слово язык, чтобы было просто английский, немецкий...). у существующих записей чтобы убрать, нужно только sql запрос выполнить, т.к. в этом поле можно выбрать несколько значений и простым массовым редактированием не вывернуться
Наверное как то так
$sql_upd = "
UPDATE `".DATA_TABLE."341` upd, `".DATA_TABLE."341` p
SET upd.`f3751` = REPLACE(p.`f3751`,' язык','')
WHERE upd.`id` = p.`id`
AND upd.`f3751` LIKE('% язык%')
";
$res_upd = sql_query($sql_upd);
А если нужно изменить какую то одну, конкретную стоку то добавьте в самый конец запроса еще оно условие

" AND upd.`id` = XXX"
где ХХХ - id нужной записи

Сообщение отредактировал maksn: 28 Июнь 2017 - 15:29

"...Сижу, паяю. CRM починяю..."
Мои разработки

#3 d654525

    Активный участник

  • Пользователи
  • PipPipPip
  • 90 сообщений

Отправлено 29 Июнь 2017 - 08:36

Просмотр сообщенияmaksn (28 Июнь 2017 - 15:14) писал:

Наверное как то так
$sql_upd = "
UPDATE `".DATA_TABLE."341` upd, `".DATA_TABLE."341` p
SET upd.`f3751` = REPLACE(p.`f3751`,' язык','')
WHERE upd.`id` = p.`id`
AND upd.`f3751` LIKE('% язык%')
";
$res_upd = sql_query($sql_upd);
А если нужно изменить какую то одну, конкретную стоку то добавьте в самый конец запроса еще оно условие

" AND upd.`id` = XXX"
где ХХХ - id нужной записи

отлично работает! спасибо большое! кто не знает, это можно в допдействие в вычисление сохранить.

Сообщение отредактировал d654525: 29 Июнь 2017 - 08:37


#4 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 762 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 29 Июнь 2017 - 17:34

Не совсем понял, зачем для этого запрос сочинять (если это именно код для доп.действия), все же можно проще сделать:

$line['f3751'] = mb_ereg_replace(" язык", "", $line['f3751']);

#5 maksn

    Активный участник

  • Пользователи
  • PipPipPip
  • 314 сообщений
  • Пол:Мужчина

Отправлено 29 Июнь 2017 - 18:44

Просмотр сообщенияCbCoder (29 Июнь 2017 - 17:34) писал:

Не совсем понял, зачем для этого запрос сочинять (если это именно код для доп.действия), все же можно проще сделать:

$line['f3751'] = mb_ereg_replace(" язык", "", $line['f3751']);
Этот запрос удаляет за один проход часть фразы по всем записям в таблице, где есть искомая, удаляемая часть. См. первый пост автора
А Ваш код обработает только одну, текущую запись.

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

Сообщение отредактировал maksn: 29 Июнь 2017 - 20:53

"...Сижу, паяю. CRM починяю..."
Мои разработки

#6 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 762 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 30 Июнь 2017 - 12:24

Так как раз в первом посте речь шла о доп.действии - а оно в любом случае проходит по всем записям, если конечно принудительно его не обрывать. Такова текущая логика. Если важна именно производительность (а не простота кода) - это другой вопрос. Но тогда и смысла в д.д. просто нет - идите в edit_sql.php и выполняйте запрос там.

#7 maksn

    Активный участник

  • Пользователи
  • PipPipPip
  • 314 сообщений
  • Пол:Мужчина

Отправлено 30 Июнь 2017 - 20:58

Просмотр сообщенияCbCoder (30 Июнь 2017 - 12:24) писал:

Так как раз в первом посте речь шла о доп.действии - а оно в любом случае проходит по всем записям, если конечно принудительно его не обрывать. Такова текущая логика. Если важна именно производительность (а не простота кода) - это другой вопрос. Но тогда и смысла в д.д. просто нет - идите в edit_sql.php и выполняйте запрос там.
Не хотелось вступать в полемику по столь незначительному вопросу.
Честно говоря не думал, что тут нужно что то объяснять. Но похоже надо.
Итак. Делаем доп. действие со ВСПЛЫВАЮЩИМ окном. Это обязательно
Вставляем туда вот такой код
$need_table_id = 341;//ID таблицы.Если по другой таблице, то подставить соответствующий ID
if((isset($_POST['process']))&&(intval($_POST['process'])==1))
{ //Нажата кнопка Заменить
  $from_str = $_POST['from_str'];
  $to_str = $_POST['to_str'];
  $sel_field_id = intval($_POST['need_field']);
  /****Формируем запрос****/
  $sql_upd = "
  UPDATE `".DATA_TABLE.$need_table_id."` upd, `".DATA_TABLE.$need_table_id."` p
  SET upd.`f".$sel_field_id."` = REPLACE(p.`f".$sel_field_id."`,'".$from_str."','".$to_str."')
  WHERE upd.`id` = p.`id`
  AND upd.`f".$sel_field_id."` LIKE('%".$from_str."%')
  ";
  $res_upd = sql_query($sql_upd);
}
?>
<form name=execute id=execute action="" method="post" enctype=multipart/form-data>
<table width=400 border=0>
<tr>
<td width="100%">
   Заменить:&nbsp;<input type=text name=from_str size=30 value="">
</td>
</tr>
<tr>
<td width="100%">
   &nbsp;
</td>
</tr>
<tr>
<td width="100%">
   На:&nbsp;<input type=text name=to_str size=30 value="">
</td>
</tr>
<tr>
<td width="100%">
   &nbsp;
</td>
</tr>
<tr>
<td width="100%">
   Выбираем поле:&nbsp;<SELECT name=need_field>
<?
/**** Сфорируем SELECT со списком текстовых полей в выбранной таблице*******/
$sql_fields ="
SELECT `id`,`name_field`,`field_num` FROM `".FIELDS_TABLE."`
WHERE `table_id` = ".$need_table_id."
AND `type_field`=3
ORDER BY `field_num`
";
$res_fields = sql_query($sql_fields);
while($row_fields=sql_fetch_assoc($res_fields))
{
?>
   <option value="<? echo $row_fields['id']; ?>"><? echo $row_fields['name_field']; ?></option>
<?
}
?>  
   </SELECT>
</td>
</tr>
<tr>
<td width="100%">
   &nbsp;
   <input type hidden name=process value=1>
   <input type hidden name=csrf value="<? echo $csrf; ?>">
</td>
</tr>
<tr>
<td width="100%" align=right>
   <input type=submit value="Заменить"
</td>
</tr>
</table>

Будет всплывать форма, в которой можно указать фразу, которую нужно заменить, фразу на которую меняем и текстовое поле, в котором нужно произвести замену.
Нажимаем "Заменить" и во ВСЕХ записях выбранного поля будет произведена замена ОДНИМ запросом.
Запускать ДД можно из любой записи текущей таблицы

Ваш же код может быть применен только один раз. После того, как он отработает, исчезнет смысл иметь его. Искомой фразы уже не будет
Да и производительность его оставляет желать лучшего.

Вот собственно за этим я и "сочинял запрос". Но Вы правы в одном - лучше все это проделать в edit_sql.php один раз и забыть.

Сообщение отредактировал maksn: 30 Июнь 2017 - 22:17

"...Сижу, паяю. CRM починяю..."
Мои разработки

#8 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 762 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 02 Июль 2017 - 13:17

Ваш пример с формой - это несколько искусственная конструкция, т.к., повторюсь еще раз, д.д. задумано для выполнения действия по текущей записи, или как минимум связанных с ней операций. А тут получается надо зайти в произвольную запись таблицы чтобы выполнить некую операцию по всем записям. Хотя с другой стороны, это уже ваше дело как КБ использовать. Скорее тут даже наша недоделка по невозможности создания д.д. (в том числе всплывающих) для выполнения кода по всей таблице, но в планах вроде это есть.





Количество пользователей, читающих эту тему: 2

0 пользователей, 2 гостей, 0 анонимных