2016-01-07 5 views
0

Унаследовано 20 000 баз данных книг с определенным полем под названием «ключевые слова», которое является беспорядком, в одной огромной таблице, называемой книгами. Попытка добавить значение к каждому из полей «ключевые слова», которое читает слова в этом поле и определяет его точную категорию с помощью одной четкой фразы.Добавление значения в поле

Итак, поиск слова «древний» и добавление значения «меню-древнее».

UPDATE books SET keywords=CONCAT('menu-ancient, ',keywords) 
where keywords like '%ancient%'; 

Это работает, но следующий запрос не делает то, что я хочу!

Предполагается найти все, что только что было сделано, и пройти через них, чтобы найти, у кого из них также есть слово «средневековое», чтобы дать меню подменю - древнее-средневековое.

UPDATE books SET keywords=CONCAT('menu-ancient-medieval, ',keywords) 
where keywords = 'menu-ancient' AND keywords LIKE '%medieval%'; 

Одним из примеров поля заключается в следующем: меню древних, WAR, СРЕДНИЙ ВОЗРАСТ, древний и средневековый, ДРЕВНИЕ К 19-го века,

Я получил меню-древнего предваряется но не к чему с. средневековый бит!

+1

Если я понимаю ваше объяснение, следует ли это не просто изменить из 'keywords = 'menu-ancient'' в' keywords LIKE' menu-ancient% '? –

+0

Первое UPDATE работает отлично, и правильно вставляет новое значение «menu-ancient». Но когда выполняется следующая строка запроса, следующий UPDATE, он не может найти слово «средневековое». Я попробовал метод LIKE и получил «меню-древнее-средневековое, меню древне-древне-древнее, меню-древнее, меню-древнее, NOISBN, PUNIC WARS. РИМ, ДРЕВНИЙ И СРЕДНИЙ, ДРЕВНИЙ В 19-Й ВЕК, I я задаюсь вопросом, пытаться ли выполнить 30 запросов один за другим, строя подменю слишком много! – Jon

+0

Сравнение равенства (** '=' ** operator) не будет соответствовать ни одному из строк, которые были просто обновлены путем добавления ** ' «menu-ancient», «**» к существующему значению. Сравнение равенства будет соответствовать значениям столбца «ключевые слова», которые соответствуют указанной строке. Запятая, добавленная к значению столбца, приведет к сравнению равенства с ' «menu-ancient'', чтобы вернуть FALSE. Подумайте о том, чтобы использовать сравнение« LIKE »или« FIND_IN_SET ». – spencer7593

ответ

0

Вы можете использовать функцию find_in_set() для этого.

Это работает, как в следующем примере:

SELECT * from books where FIND_IN_SET('menu-ancient', keywords) > 0; 

Вы можете применить это к вашему запросу обновления

UPDATE books 
SET keywords=CONCAT('menu-ancient-medieval, ',keywords) 
where 
    FIND_IN_SET('menu-ancient', keywords) 
    AND keywords LIKE '%medieval%'; 

Примечание: Я не совсем уверен, что я понимаю вашу вторую часть вопроса правильно. Возможно, вам придется изменить запрос на использование подзапроса в вашем предложении where.

+0

Вторая часть означала - если существует ключевое слово« древний », меню« предварительное »- древнее. Следующий запрос говорит, если ключевое слово (сейчас) существует, а также ключевое слово «средневековое», затем добавьте «menu-ancient-medie» val ' – Jon

+0

Я думал, что EACH-запрос будет работать в базе данных. Однако теперь я думаю, что ВСЕ запросы работают в базе данных. Он не обновляется после каждого запроса, для следующего запроса для работы, но все запросы выполняют свой бит, затем база данных обновляется. Как я могу получить, что будет выполнено 80 запросов без ввода одного за другим в phpmyadmin. – Jon

Смежные вопросы