3

这是我的桌子:

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 的列值的值为 2 ,其中 id=1 而不是 3。当它匹配第一行时更新是否停止?我认为在这种情况下,它将在 t1 和 t2 之间进行完整的数据匹配。任何帮助表示赞赏!

更新

谢谢,这是我正在处理的情况:

对于 t2 中的值,将它们以 ',' 分隔,并按每个 id 合并到表 t1 中的值组中,但是,t1 值中的所有元素都应该是不同的。例如:如上表 t1 和 t2 列表,更新操作后,t1 的值应为:“1,2,3”,既不是 2 也不是 3。

如果我使用函数 groupconcat(),则很难使值与 t1 的值不同。

Agin,我认为像这种情况下只更新行并不聪明。如果跨多个表进行更新,则连接条件匹配的所有行都应在循环中一一更新。

4

2 回答 2

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

结果:

+--------+-------+
| 编号 | 价值 |
+--------+-------+
| 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

| 身份证 | 价值 |
|----|-------|
| 1 | 1,4 |

更新的结果将是

| 身份证 | 价值 |
|----|---------|
| 1 | 1,2,3,4 |

这是SQLFiddle演示

从长远来看,您最好重新考虑您的数据库架构并规范化您的数据。通过允许正常维护和查询您的数据,这将带来巨大的回报。

于 2013-10-09T18:55:11.680 回答
0

多么奇怪的询问!似乎 MySQL 足够聪明,不会更新同一行 4 次。但除此之外,在任何数据库上,结果(t1.value 的新值)都是未定义的。您应该始终确保使用一行的值进行更新,或使用聚合函数(如 min、max、...)

于 2013-10-09T08:06:21.730 回答