这是我的表:
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)
我想知道为什么匹配count的行是1,并且它很难理解t1的列值具有值2,其中id = 1而不是3.Is更新在匹配第一个时停止排? 我认为在这种情况下,它将在t1和t2之间进行完整的数据匹配。 任何帮助表示赞赏!
谢谢,以下是我与actully打交道的情况:
对于t2中的值,将它们分隔为','并且每个id合并到表t1组中的值,但是,t1的值中的所有元素都应该是不同的。例如:如上面的表t1和t2列表,在更新操作之后,t1&#39 ; s值应为:" 1,2,3",既不是2也不是3。
如果我使用函数groupconcat(),那么很难使值与t1的值不同。
Agin,我不认为在这种情况下只更新行更聪明。如果跨多个表更新,则连接条件匹配的所有行应逐个更新一个循环。
答案 0 :(得分:1)
根据您对问题的更新,您可以这样做
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 | value | +------+-------+ | 1 | 1,2,3 | +------+-------+
这是 SQLFiddle 演示
更新:根据您的评论再次更改了您的问题。为了能够根据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 |
这是 SQLFiddle 演示
从长远来看,所有人都说你最好重新考虑你的数据库架构并规范化数据。这将通过允许正常维护和查询您的数据来节省大量时间。
答案 1 :(得分:0)
多么奇怪的查询!似乎MySQL足够聪明,不能同时更新同一行4次。但除此之外,在任何数据库上的结果(t1.value的新值)都是未定义的。您应始终确保使用一行值更新,或使用聚合函数(如min,max,...)