sql >> データベース >  >> RDS >> Mysql

MySQLの更新ステートメントは最初の行にのみ一致します

    質問の更新に基づいて、次のように行うことができます

    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 |
    +------+-------+
    

    こちらがSQLFiddle です。 デモ

    更新: あなたの質問を再び変えたあなたのコメントに基づいています。 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 |
    

    これがSQLFiddle です。 デモ

    長期的には、データベーススキーマを再検討し、データを正規化する方がよいと言われています。 。これにより、データの通常の保守とクエリが可能になり、大きな成果が得られます。



    1. macOSSierraにmysql2gemをインストールできません

    2. ローカルホストに接続できませんが、SQLServer2008ではコンピューター名を使用できます

    3. 名前付きパラメーターを使用したHibernateネイティブクエリの問題

    4. PHPのOCI8/Oracle oci_bind_array_by_nameが機能しないのはなぜですか?