質問の更新に基づいて、次のように行うことができます
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 | +------+-------+
こちらが
更新: あなたの質問を再び変えたあなたのコメントに基づいています。 t1
で区切られた値の文字列を更新できるようにするため t2
の値に基づく t1.value
を分割するには、numbers(tally)テーブルの助けが必要です。 その場で。このようなテーブルを簡単に作成できます
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 |
これが
長期的には、データベーススキーマを再検討し、データを正規化する方がよいと言われています。 。これにより、データの通常の保守とクエリが可能になり、大きな成果が得られます。