web-dev-qa-db-ja.com

Mysql:GROUP_CONCATを使用してJSON列タイプに挿入

JSONタイプの列に単語のリストを挿入しようとしています:

create table my_table (
    ...
    synonyms JSON
    ...
)

私のクエリは次のようになります:

INSERT into my_table (id, synonyms)
SELECT id, GROUP_CONCAT(DISTINCT synonyms) as synonyms from (
  SELECT id, name1,name2, GROUP_CONCAT(DISTINCT name1) as synonyms
  FROM products
  GROUP BY id

  UNION

  SELECT id, name1,name2, GROUP_CONCAT(DISTINCT name2) as synonyms
  FROM products
  GROUP BY id
) t group by id;

1行目のINSERTなしで実行すると、synonyms列はコンマ区切りの単語のリストを返します。

id       name1    name2    synonyms
------------------------------------
1        one      a,b      one,a,b
2        two      c        two,c

これらの同義語をJSON_ARRAYとして挿入したいと思います。ただし、個々の単語が二重引用符で囲まれていない場合、INSERTは失敗します。私の選択にJSON_ARRAYを追加した場合:

SELECT name1,name2,id, JSON_ARRAY(GROUP_CONCAT(DISTINCT synonyms)) ...

次の結果が得られます。

name1    name2    synonyms
----------------------------
one      a,b      ["one,a,b"]
two      c        ["two,c"]

私が欲しいのはこれです(つまり、synonyms列に直接挿入できます):

name1    name2    synonyms
----------------------------
one      a,b      ["one","a","b"]
two      c        ["two","c"]

SQLでこれを行う方法はありますか、それともアプリケーションコード内でより適切に処理されますか?

1
blindsnowmobile

GROUP_CONCAT()の代わりに JSON_ARRAYAGG() を使用します。 - アキナ

5.7.22+でのみ使用可能です

暗黙のDISTINCTはありますか?わかりません...そうでない場合は、DISTINCTを使用したサブクエリが役立ちます。

0
user126897

このサンプルのように、group_concat内にconcatを追加してこれを実現できます。

SELECT name1, name2, id, 
       CONCAT(
          '[',
          GROUP_CONCAT(
             CONCAT(
                '"',
                synonyms,
                '"'
             )
          ),
          ']'
       ) 
0
Muthu