2010-10-10 40 views
1

我有一个有趣的查询,我想知道是否有人可以帮忙?mysql复杂更新和替换

基本上,我有三个表,标题,属性和ATTRIBUTE_VALUE

标题包含了像“由{用户}在{类别}创建于{日期}”然后在属性表,我有模板列表包含大括号内包含参数定义的行。

然后在attribute_value表中,我有值。

我遇到的问题是,查询似乎没有存储每行的替换,直到查询完成,这意味着行只接收最后一次更新,不完整。

update Title inner join Attribute_Value on Attribute_Value.GenericID = Title.CollectibleID and Attribute_Value.GenericType = 'collectible' inner join Attribute on Attribute.AttributeID = Attribute_Value.AttributeID set Title.Title = replace(Title.Title, concat('{', Attribute.Name, '}'), Attribute_Value.Value) 

所以基本上,它会取代{}日期正确,但是当它去取代{用户},{DATE}不是替代价值,但仍然{}日期与{}类相同。但是当它完成时,我想知道如何使用值更新Title列,同时保持以前替换的值吗?

干杯

GAV株系

+0

您需要为模板中的每个值加入一次Attribute_value - 在此情况下为3次。每个加入都会覆盖一个值。 – Martin 2010-10-10 21:08:34

+0

@Martin,属性名称/值和标题都是完全通用的。那几乎不可能处理。 – Gavin 2010-10-10 21:34:51

+0

同意。我认为最简单的解决方案是在应用程序中进行替换:检索模板,提取属性列表,然后检索属性,最后执行替换。 – Martin 2010-10-11 06:20:54

回答

0

如果属性列表是静态的,我可能会去与子查询和嵌套的SQL REPLACE()。否则,编写自己的SQL函数遍历所有可能的属性名称并进行替换。

+0

不幸的是,标题和属性名称/值是完全通用的。谢谢您的好意。) – Gavin 2010-10-10 21:33:50

1

您可以编写一个stored procedure,它使用cursor更新Title中的属性。

+0

可能,尽管这会采取永远跑:(看来该行仅更新整个查询完成时,而不是在该行完成 – Gavin 2010-10-10 21:32:50

+0

我不知道你的意思,我总是去为了正确的代码,然后担心性能。 – grossvogel 2010-10-10 21:58:40