sql >> Databasteknik >  >> RDS >> Mysql

MySQL-uppdateringssatsen matchar endast den första raden

Baserat på din uppdatering av din fråga kan du göra det så här

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   | value |
+------+-------+
|    1 | 1,2,3 |
+------+-------+

Här är SQLFiddle demo

UPPDATERING: Baserat på dina kommentarer som ändrade din fråga igen. För att kunna uppdatera en avgränsad sträng av värden i t1 baserat på värden i t2 du behöver hjälp av en taltabell för att dela t1.value i farten. Du kan enkelt skapa en sådan tabell som den här

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

Det skriptet skapar en tabell med en nummersekvens från 1 till 100 som gör det möjligt att effektivt dela upp till 100 avgränsade värden. Om du behöver mer eller mindre kan du enkelt justera skriptet.

Nu ska du uppdatera t1.value du kan göra

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

Förutsatt att du har i t1

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

resultatet av uppdateringen blir

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

Här är SQLFiddle demo

Med det sagt i det långa loppet det är bättre att ompröva ditt db-schema och normalisera dina data . Det kommer att löna sig stort genom att tillåta att normalt underhålla och söka efter dina data.



  1. Dela strängkolumnvärden

  2. Utveckling WordPress admin länk omdirigering till live webbplats

  3. Laravel vältalig hitta returnerar null

  4. OracleCommand SQL Parametrar Bindning