我如何在包含concat的更新查询中消除重复项

时间:2011-04-20 23:14:19

标签: 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;

它运行正常,但每次运行查询时都会产生重复。 我尝试添加不同但我收到错误,我不确定在这种情况下这是正确的做法。

感谢您的合作,我一直在寻找各种各样的方式而没有成功。

2 个答案:

答案 0 :(得分:1)

如果您有唯一键,则在插入重复值时会产生错误并且是预期的行为。我认为您应该看到的是on duplicate key update,您可以在其中指定如果找到重复项该怎么做。

答案 1 :(得分:0)

每次运行查询时,都会将title添加到当前description。如果你连续三次运行它,你将得到

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

这是你的意思吗?这正是查询的目的。也许您需要另一列来保留“base_description”,以便每次“描述”变为“标题”+ 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