如果列值类似于另一个逗号分隔列,则Mysql将列从一个表更新到另一个表

时间:2017-01-30 13:34:06

标签: mysql sql

我有一个带有两个表的MySQL数据库。 表1看起来像这样:

uid | text              |reference  |
-------------------------------------
1   |                   | 1         |
2   |                   | 1,2       |
3   |                   | 2         |
4   |                   | 3         |
5   |                   | 1,3,2,4,5 |
6   |                   | 5         |
7   |                   | 4         |

表2看起来像这样

uid | text              |
-------------------------
1   | text1             |
2   | text2             |
3   | text3             |
4   | text4             |
5   | text5             |
6   | text6             |
7   | text7             |

我想更新Table1,因此它变为:

uid | text                          | reference |
---------------------------------------------------
1   | text1                         | 1         |
2   | text2 text2                   | 1,2       |
3   | text2                         | 2         |
4   | text3                         | 3         |
5   | text1 text3 text2 text2 text5 | 1,3,2,4,5 |
6   | text5                         | 5         |
7   | text4                         | 4         |

我发现了以下命令并且无法使其适应我的案例

UPDATE table1 AS text
INNER JOIN table2 AS text 
    ON table1.reference = table2.reference
SET table1.text = table2.text

table1中的文字列应与[{1}}与table1.reference进行比较。如果参考值为1,则与table2.uid对应的文本将被复制到table2.uid #1。如果引用为1,2,则将复制与table1.text对应的文本。 谢谢!

1 个答案:

答案 0 :(得分:0)

此问题说明了为什么在单行中存储以逗号分隔的值是不好的做法。这种关系更好地使用附加关系表建模,在您的情况下看起来像这样:

TableRef
uid  |referenceUid |
--------------------
1    | 1           |
2    | 1           |
2    | 2           |
3    | 2           |
4    | 3           |
5    | 1           |
5    | 2           |
5    | 3           |
5    | 4           |
5    | 5           |
...  | ...         |

这样,您可以像这样进行所需的更新

update  Table1 t1, (
            select  t3.uid, group_concat(t2.text order by t2.text separator ' ') as text
            from    TableRef t3
            join    Table2 t2
            on      t3.referenceUid = t2.uid
            group by t3.uid
        ) t4
set     t1.text = t4.text
where   t1.uid = t4.uid

您可以在行动here

中看到此查询