Произвести поиск и добавить значение

Тема в разделе "Базы данных", создана пользователем Ssendem, 15 ноя 2014.

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

    Ssendem

    Регистр.:
    28 май 2010
    Сообщения:
    415
    Симпатии:
    466
    В БД полный ноль. Задача:
    Есть короткое и полное описание товара, Надо по определенному слову в описании товара добавить определённый тег, т.е. ищем товар с описанием в котором есть слово "новогодние" и нашедшему товару добавляем тег "newyear".
    Я посмотрел в БД - получается короткое и полное описание находятся в таблице ps_product_lang, список всех тегов в ps_tag, а назначаются определенные теги соответствующим товарам в ps_product_tag. Пошагово должно выглядеть так(наверное) :
    1. Идёт запрос по нужным словам в таблицу ps_product_lang и в полях description и description_short ищет требуемое. Когда находит соответственно узнаёт id_product.
    [​IMG]
    2. В ps_tag добавляет нужный тег(при этом надо чтобы не создавал дублей) и узнаёт id_tag созданного тега.
    [​IMG]
    3. В ps_product_tag создаёт строку с нужным id_product и требуемым id_tag.
    [​IMG]
     
  2. Tibald

    Tibald

    Регистр.:
    16 окт 2007
    Сообщения:
    166
    Симпатии:
    64
    Я учусь только, по этому без бекапа не запускай))
    Сначала создаем тег нужный, отдельным запросом
    INSERT INTO ps_tag (name) VALUES ('newyear'); //Если у тебя колонка id - auto_increment, если нет - тогда так: NSERT INTO ps_tag (id, name) VALUES (''максимальный айди + 1',newyear');
    Затем, когда у тебя уже тег newyear с любым айди существует в колонке ps_tag то вот такой запрос:
    Это добавит в ps_product_tag товары, в описаниях и кратких описаниях которых попадается слово "новогодние" и проставит им айди тега, имя которого "newyear";
    INSERT INTO ps_product_tag (id_product,id_tag) VALUES((SELECT DISTINCT id_product FROM ps_tag WHERE description LIKE 'новогодние' OR description_short LIKE 'новогодние'),(SELECT id_tag FROM ps_tag WHERE name='newyear'));

    Еще можешь в запросе заменить 'новогодние' на 'новогодн%' - тогда у тебя туда попадут и с текстом новогодний, новогодняя и т.п. склонения.
     
  3. segalp

    segalp Создатель

    Регистр.:
    11 май 2013
    Сообщения:
    11
    Симпатии:
    4
    Данную задачу можно решить несколькими способами, но самым оптимальным будет использование выражения INSERT SELECT, в котором получить id продукта, а код тега подставлять вручную.
    Допустим нужно прошерстить newyear который предварительно записан в таблице ps_tag {1;'newyear'} тогда запрос будет выглядеть следующим образом:
    INSERT INTO ps_product_tag (id_product,id_tag) SELECT id_product, 1 FROM ps_product_lang WHERE description LIKE '%новогодние%' OR description_short LIKE '%новогодние%';
     
  4. newminer

    newminer Создатель

    Регистр.:
    21 апр 2015
    Сообщения:
    13
    Симпатии:
    4
    предыдущий пост не защищает от создания тагов-дублей. Для защиты в условие требуется добавить связь с таблицей продукт_таг q и описаний тагов qq (left join-om) c условием, что наименование тага=искомому тагу, и добавить в главное условие: q.id_tag is null
     
    segalp нравится это.
  5. segalp

    segalp Создатель

    Регистр.:
    11 май 2013
    Сообщения:
    11
    Симпатии:
    4
    Кстати да хорошее дополнение, но в вопросе защиты от дублей, лучше будет отсечь такую вероятность на корню, добавив уникальный индекс на оба поля в таблице "ps_product_tag".
     
  6. newminer

    newminer Создатель

    Регистр.:
    21 апр 2015
    Сообщения:
    13
    Симпатии:
    4
    Тоже идея. Но, на мой взгляд, нужно учесть, что будет постоянно срабатывать исключение (ошибка:( "Дублирующее значение в уникальный ключ". И инсерт не будет выполняться совсем.
     
  7. latteo

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

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.404
    Симпатии:
    1.185
    Решается через
    INSERT IGNORE
     
  8. segalp

    segalp Создатель

    Регистр.:
    11 май 2013
    Сообщения:
    11
    Симпатии:
    4
    Либо как вариант можно добавить поле сортировки по тегам в таблицу "ps_product_tag" и с помощью конструкции "ON DUPLICATE KEY UPDATE" увеличивать это поле, дабы потом можно было сортировать товары по этим ключевикам :crazy:
     
Статус темы:
Закрыта.