2010-10-10 5 views
1

J'ai une requête intéressante que je me demande si quelqu'un peut aider?mysql mise à jour complexe et remplacer

Fondamentalement, j'ai trois tables, Titre, attributs et attribute_value

Titre contient une liste de modèles tels que "Créé le {date} par {utilisateur} dans {Catégorie} puis dans la table d'attributs, je les lignes qui contiennent une définition des paramètres enveloppés dans des accolades. Puis, dans la table attribut_value, j'ai les valeurs. Le problème que j'ai est que la requête ne semble pas stocker le remplacer sur chaque ligne jusqu'à ce que la requête soit terminée, ce qui signifie que la ligne ne reçoit que la dernière mise à jour, incomplète.

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) 

Donc, fondamentalement, il remplacera {date} correctement, mais quand il va remplacer {User}, {Date} n'est pas la valeur remplacée mais {date} et {même avec Catégorie}. Mais quand c'est fini, le

Une idée sur la façon dont je peux mettre à jour la colonne Titre avec les valeurs, tout en conservant les valeurs précédemment remplacées?

Vive

Gav

+0

Vous devez joindre une valeur d'attribut une fois pour chaque valeur du modèle, dans ce cas 3 fois. Chaque jointure couvrira une valeur. – Martin

+0

@Martin, l'attribut nom/valeur et le titre sont tous complètement génériques. Ce serait pratiquement impossible à gérer. – Gavin

+0

D'accord. Je pense que la solution la plus simple est de faire le remplacement dans votre application: récupérer le modèle, extraire la liste des attributs, puis récupérer les attributs, enfin effectuer les substitutions. – Martin

Répondre

0

Si la liste des attributs est statique, je serais probablement aller avec les sous-requêtes et un SQL imbriqué REPLACE(). Sinon, écrivez votre propre fonction SQL pour parcourir tous les noms d'attributs possibles et effectuer les substitutions.

+0

Malheureusement, le nom et les valeurs du titre et de l'attribut sont complètement génériques. Merci cependant;) – Gavin

1

Vous pouvez écrire un stored procedure qui utilise un cursor pour mettre à jour les attributs dans Title un à la fois.

+0

Probablement, bien que cela prendrait une éternité à s'exécuter :(Il semble que la ligne ne se met à jour que lorsque la requête est complète, et non lorsque la ligne est complète – Gavin

+0

Je ne suis pas sûr de ce que vous voulez dire. pour le code correct d'abord, puis s'inquiéter de la performance. – grossvogel