2016-11-02 11 views
0

私はjson形式でフィールドを変更したログを記録するテーブルを持っています。 現在、バージョンと差分ごとにデータ全体を取得してアプリケーションに保存しています。しかし、それはOOMを上げることができるように多くのデータをプルするので、私はdb側でそれをやりたい。mysqlでjsonデータを作成する簡単な方法はありますか?

自己結合によって変更されたレコードを取得することができましたが、jsonで変更されたデータを作成することはできません。

json文字列を生成する方法はありますか?

以下はスキーマです。

私は {「名前」:「更新」}以下のようなJSONを作りたい
create table A { id int not null primary key auto_increment, 
      code int not null, 
      version int not null, 
      name varcher(10) not null, 
      content varcahr(10) not null) ; 

create table logging (id int not null primary key auto_increment, 
        version int not null, 
        code int not null, 
        changed varcher(1024)); 

INSERT INTO logging (version, code , changed) 
SELECT A2.version, A2.code, ?     <- I don't know how create json 
FROM A A1 inner join A A2 ON A1.code = A2.code 
WHERE A1.version = 1 AND A2.version = 2 
    AND (A1.name != A2.name OR A1.content != A2.content) 

名前場合のみ、名前が {「UPDATED_CONTENT」:「更新」、「コンテンツ」、「名前を」}変更された場合&の内容が変更されました。 (ポストにはサンプルデータとサンプル出力がないとして)私は完全に所望の出力を理解していれば、私はMariaDB 10.0.22

答えて

0

わからないを使用してい

また、データをJSONに変換するMySQLコマンドはありません。 アプリケーション側で簡単に行うこともできますし、文字列連結を使用してクエリ内に構築することもできます(一般的にはこれはベストプラクティスではありません!JSON構文が単純で短いです)。

データベースにJSON文字列を格納することもベストプラクティスではありません。テーブルAがある場合、テーブルloggingが必要なのはなぜですか?

INSERT INTO logging (VERSION, CODE , CHANGED) 
SELECT A2.version, A2.code, 
IF(A1.content = A2.content, 
    -- no content change 
    CONCAT("{\"name\":\"", A2.name, "\"}"), 
    -- content was also changed 
    CONCAT("{\"name\":\"", A2.name, "\", \"content\": \"", A2.content, "\"}")) AS json_description      
FROM A A1 INNER JOIN A A2 ON A1.code = A2.code 
WHERE A1.version = 1 AND A2.version = 2 
    AND (A1.name != A2.name OR A1.content != A2.content) 
+1

JSONをデータベース側ではなくアプリケーション側でアセンブルすることをお勧めします。 – sylverfyre

関連する問題