这是我的桌子:
mysql> select * from t1; +------+-------+ | id | value | +------+-------+ | 1 | 1 | +------+-------+ 1 row in set (0.00 sec) mysql> select * from t2; +------+-------+ | id | value | +------+-------+ | 1 | 2 | | 1 | 1 | | 1 | 2 | | 1 | 3 | +------+-------+ 4 rows in set (0.00 sec)
然后,出于某种目的,我运行sql更新表t1中的日期:
mysql> update t1 join t2 on t1.id=t2.id set t1.value=t2.value ; Query OK, 0 rows affected (0.00 sec) Rows matched: 1 Changed: 0 Warnings: 0
现在,查看更改:
mysql> select * from t1; +------+-------+ | id | value | +------+-------+ | 1 | 2 | +------+-------+ 1 row in set (0.00 sec)
我不知道为什么匹配的行数为1,并且很难理解t1的列的值是id = 1而不是3的值2。当它与第一行匹配时,更新停止了吗?我认为在这种情况下,它将在t1和t2之间进行完整的数据匹配。任何帮助表示赞赏!
谢谢,这是我正在认真处理的情况:
对于t2中的值,将它们用’,’分隔,并通过每个id合并到表t1组中的值,但是,t1中值的所有元素都应该是不同的。例如:如上面的表t1和t2所示,更新操作后,t1的值应为:“ 1、2、3”,既不是2也不是3。
如果我使用groupconcat()函数,将很难使t1的值与众不同。
再次,我不认为在这种情况下仅在行上进行更新是明智的。如果跨多个表进行更新,则所有与连接条件匹配的行都应循环循环更新。
根据您对问题的更新,您可以这样做
UPDATE t1 JOIN ( SELECT id, GROUP_CONCAT(DISTINCT value ORDER BY value) value FROM t2 GROUP BY id ) q ON t1.id = q.id SET t1.value = q.value
结果:
+ ------ + ------- + | id | 值| + ------ + ------- + | 1 | 1,2,3 | + ------ + ------- +
这是 SQLFiddle 演示
更新: 根据您的评论,这再次改变了您的问题。为了能够t1基于中的值更新定界的值字符串,t2您需要数字表(tally)的帮助来t1.value即时拆分。您可以像这样轻松创建此类表格
t1
t2
t1.value
CREATE TABLE tally(n INT NOT NULL PRIMARY KEY); INSERT INTO tally (n) SELECT a.N + b.N * 10 + 1 n FROM (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a ,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b ORDER BY n
该脚本会创建一个表,表中的数字从1到100,可以有效分割多达100个定界值。如果您需要更多或更少,则可以轻松调整脚本。
现在更新t1.value,你可以做
UPDATE t1 JOIN ( SELECT id, GROUP_CONCAT(value ORDER BY value) value FROM ( SELECT id, SUBSTRING_INDEX(SUBSTRING_INDEX(t1.value, ',', n.n), ',', -1) value FROM t1 CROSS JOIN tally n WHERE n.n <= 1 + (LENGTH(t1.value) - LENGTH(REPLACE(t1.value, ',', ''))) UNION SELECT id, value FROM t2 ) v GROUP BY id ) q ON t1.id = q.id SET t1.value = q.value
假设你有 t1
| ID | value| | ---- | ------- | | 1 | 1,4 |
更新的结果将是
| ID | value| | ---- | --------- | | 1 | 1,2,3,4 |
从长远来看, 您最好重新考虑数据库模式并规范化数据 。通过允许正常维护和查询数据,这将节省大量时间。