简体   繁体   中英

How to replace substring in mysql where string is based on other table-column values

I have two mysql tables as

Component
+----+-------------------------+--------+
| OldComponentId | NewComponentId       |
+----+-------------------------+--------+
|  15        |                  85      |
|  16        |                  86      |
|  17        |                  87      |
+----+-------------------------+--------+

Formulae
+----+-------------------------+--------+
| id         | formula_string           |
+----+-------------------------+--------+
|  1         |    A+15-16+17            |
|  2         |    16+15-17              |
+----+-------------------------+--------+

I want to replace value of formula_string on the basis of NewComponentId as


Formulae
+----+-------------------------+--------+
| id         | formula_string           |
+----+-------------------------+--------+
|  1         |    A+85-86+87            |
|  2         |    86+85-87              |
+----+-------------------------+--------+

I have tried with following mysql query but its not working

update Formulae fr, Component comp set formula_string=REPLACE(fr.formula_string,comp.OldComponentId,comp.NewComponentId).

Please suggest the solutions

thanks.

There is no easy way to do this. As you observed in your update statement, the replacements don't nest. They just replace one at a time.

One thing that you can do is:

update Formulae fr cross join
       Component comp
    set formula_string = REPLACE(fr.formula_string, comp.OldComponentId, comp.NewComponentId)
    where formula_string like concat('%', comp.OldComponentId, '%')

Then continue running this until row_count() returns 0 .

Do note that your structure could result in infinite loops (if A --> B and B --> A). You also have a problem of "confusion" so 10 would be replaced in 100. This suggests that your overall data structure may not be correct. Perhaps you should break up the formula into separate pieces. If they are just numbers and + and - , you can have a junction table with the value and the sign for each component. Then your query would be much easier.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM