Как бы мне устранить дубликаты в запросе на обновление, который включает concat

#mysql

#mysql

Вопрос:

Вот запрос, который я должен вызывать каждый раз, когда в базу данных добавляется новый элемент :

 UPDATE `cas_phocagallery`,`cas_phocagallery_categories`
   SET cas_phocagallery.description=concat(
       cas_phocagallery_categories.title,'<br />',cas_phocagallery.description)
 WHERE cas_phocagallery.catid = cas_phocagallery_categories.id;
  

Это работает нормально, за исключением того, что при каждом запуске запроса создается дубликат.
Я попытался добавить distinct, но получаю сообщение об ошибке, и я не уверен, что это правильно в данном случае.

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

Комментарии:

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

2. Спасибо за исправление, я совсем не эксперт и очень стараюсь найти решение.

Ответ №1:

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

Комментарии:

1. Он не вставляет, он обновляет.

2. поскольку ни один из вызванных столбцов не уникален, как бы мне использовать обновление дублированного ключа? На самом деле, что мне нужно сделать, это добавить заголовок элемента, который находится в одной таблице, к описанию, которое находится в другой таблице. И оба элемента являются частью модуля, созданного в joomla. Итак, правильно ли использовать update, я действительно не эксперт в mysql.

3. Вы можете создавать уникальные индексы в MySQL для нескольких столбцов. Читать dev.mysql.com/doc/refman/5.0/en/create-index.html для синтаксиса. Клавиша on duplicate срабатывает при наличии дубликата на основе комбинации столбцов, и вы можете использовать соответствующую инструкцию SQL для выполнения действия с дубликатом (например, обновление существующей записи, добавление значения в таблицу журнала и т.д.)

Ответ №2:

Каждый раз, когда вы запускаете запрос, вы добавляете title к текущему description . Если вы запустите его три раза подряд, вы получите

 title    <-- added by 3rd
title    <-- added by 2nd
title    <-- added by 1st
description (original)
  

Это то, что вы имеете в виду? Это именно то, для чего предназначен запрос. Возможно, вам нужен другой столбец для сохранения «base_description», чтобы каждый раз «description» становился «title» br «base_description»


Редактировать

Вы можете попробовать что-то подобное, что будет работать в 95% случаев, пока заголовок не изменится, и в этом случае вы получите накопленные исторические заголовки. Это также не работает, когда заголовок содержит % символ, и может работать забавно, если он содержит _ символ.

 UPDATE cas_phocagallery, cas_phocagallery_categories
   SET cas_phocagallery.description=concat(
       cas_phocagallery_categories.title,'<br />',cas_phocagallery.description)
 WHERE cas_phocagallery.catid = cas_phocagallery_categories.id
   AND NOT cas_phocagallery.description
           LIKE concat(cas_phocagallery_categories.title, '%')
  

Не могу прокомментировать Joomla или то, как она что-то делает, или почему это было бы необходимо (для объединения заголовка с описанием). Что вам действительно следует сделать, так это в некотором операторе SELECT в некотором модуле показать результат CONCAT вместо того, чтобы сохранять (вставлять / искажать) его в описание.

    SELECT cas_phocagallery.*, concat(cas_phocagallery_categories.title,
                                     '<br />',
                                     cas_phocagallery.description) as FullDescription
     FROM cas_phocagallery
LEFT JOIN cas_phocagallery_categories
       ON cas_phocagallery.catid = cas_phocagallery_categories.id
  

Комментарии:

1. Да, это то, что я имею в виду. На самом деле, что мне нужно сделать, это добавить заголовок элемента, который находится в одной таблице, к описанию, которое находится в другой таблице. И оба элемента являются частью модуля, созданного в joomla. Поэтому я не уверен, что обновление — это правильное действие, которое нужно предпринять. Я действительно не так хорош в программировании mysql, и это действие должно быть вставлено в php и вызвано из меню администратора в joomla. Вам нужна дополнительная информация?

2. Это работает отлично, именно то, что мне было нужно. Что вы имели в виду, говоря о необходимости объяснить снижение? Как мне приступить к голосованию?