Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Instrukcja aktualizacji MySQL pasuje tylko do pierwszego wiersza

Na podstawie aktualizacji Twojego pytania możesz to zrobić w ten sposób

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

Wynik:

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

Oto SQLFiddle demo

AKTUALIZACJA: Na podstawie Twoich komentarzy, które ponownie zmieniły Twoje pytanie. Aby móc zaktualizować rozdzielany ciąg wartości w t1 na podstawie wartości w t2 będziesz potrzebować pomocy tabeli liczb (tally), aby podzielić t1.value w locie.Możesz łatwo stworzyć taki stół

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

Skrypt ten tworzy tabelę z ciągiem liczb od 1 do 100, co pozwoli na efektywne rozbicie do 100 oddzielonych wartości. Jeśli potrzebujesz więcej lub mniej, możesz łatwo dostosować skrypt.

Teraz zaktualizuj t1.value możesz zrobić

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

Zakładając, że masz w t1

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

wynikiem aktualizacji będzie

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

Oto SQLFiddle demo

Biorąc to wszystko pod uwagę, na dłuższą metę lepiej rozważ ponownie schemat bazy danych i znormalizuj swoje dane . To się opłaci, pozwalając na normalne utrzymywanie danych i wysyłanie zapytań.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. GROUP BY znacznik czasu co 15 minut, w tym brakujące wpisy

  2. Mysql wybierz do aktualizacji - nie blokuje docelowych wierszy. Jak mogę się upewnić, że tak?

  3. SQL_NO_CACHE dla Postgresql?

  4. Problemy z MySQL LOAD XML INFILE

  5. Dynamicznie zbuduj przygotowaną instrukcję za pomocą call_user_func_array()