Mysql
 sql >> Base de données >  >> RDS >> Mysql

L'instruction de mise à jour MySQL ne correspond qu'à la première ligne

En fonction de votre mise à jour de votre question, vous pouvez le faire comme ceci

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

Résultat :

+------+-------+
| id   | value |
+------+-------+
|    1 | 1,2,3 |
+------+-------+

Voici SQLFiddle démo

MISE À JOUR : Sur la base de vos commentaires qui ont encore changé votre question. Pour pouvoir mettre à jour une chaîne délimitée de valeurs dans t1 basé sur les valeurs dans t2 vous aurez besoin de l'aide d'une table de nombres (tally) pour diviser t1.value à la volée. Vous pouvez facilement créer un tel tableau comme celui-ci

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

Ce script crée un tableau avec une séquence de nombres de 1 à 100 qui permettra de diviser efficacement jusqu'à 100 valeurs délimitées. Si vous avez besoin de plus ou moins, vous pouvez facilement ajuster le script.

Maintenant, pour mettre à jour t1.value vous pouvez faire

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

En supposant que vous avez dans t1

| ID | VALUE |
|----|-------|
|  1 |   1,4 |

le résultat de la mise à jour sera

| ID |   VALUE |
|----|---------|
|  1 | 1,2,3,4 |

Voici SQLFiddle démo

Cela étant dit, à long terme, vous feriez mieux de reconsidérer votre schéma de base de données et de normaliser vos données . Cela rapportera gros en permettant normalement de maintenir et d'interroger vos données.