sql >> Database teknologi >  >> RDS >> Mysql

MySQL-opdateringserklæring matcher kun den første række

Baseret på din opdatering af dit spørgsmål kan du gøre det sådan her

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
 

Resultat:

+------+-------+| id | værdi |+------+------+| 1 | 1,2,3 |+------+-------+

Her er SQLFiddle demo

OPDATERING: Baseret på dine kommentarer, som ændrede dit spørgsmål igen. For at kunne opdatere en afgrænset streng af værdier i t1 baseret på værdier i t2 du har brug for hjælp fra en tal(tally)-tabel til at opdele t1.value on the fly.Du kan nemt oprette sådan en tabel som denne

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
 

Dette script opretter en tabel med en sekvens af tal fra 1 til 100, som gør det muligt effektivt at opdele op til 100 afgrænsede værdier. Hvis du har brug for mere eller mindre, kan du nemt justere scriptet.

Nu skal du opdatere t1.value du kan gøre

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

Forudsat at du har i t1

| ID | VÆRDI ||----|-------|| 1 | 1,4 |

resultatet af opdateringen vil være

| ID | VÆRDI ||----|--------|| 1 | 1,2,3,4 |

Her er SQLFiddle demo

Når alt er sagt i det lange løb du må hellere genoverveje dit db-skema og normalisere dine data . Det vil betale sig stort ved at tillade normalt at vedligeholde og forespørge på dine data.



  1. Bedste metode til at gemme en liste over bruger-id'er

  2. fjerne ekstra tegn før indsættelse af data i MYSQL?

  3. skrive tabeller til Postgresql ved hjælp af rPostgreSQL, når databasenavnet kun består af store bogstaver

  4. Enum i Hibernate, fortsætter som en enum