JSON插入MySQL表或更新(如果存在)

JSON插入MySQL表或更新(如果存在),mysql,json,Mysql,Json,这是的继续,但这次我想更新mysql中的json条目 以下是模式: CREATE TABLE TAG_COUNTER ( account varchar(36) NOT NULL, time_id INT NOT NULL, counters JSON, PRIMARY KEY (account, time_id) ) 示例数据如下所示 'google', '20180510', '{"gmail_page_viewed"

这是的继续,但这次我想更新mysql中的json条目

以下是模式:

CREATE TABLE TAG_COUNTER (
    account       varchar(36) NOT NULL,
    time_id       INT NOT NULL,
    counters      JSON,
    PRIMARY KEY   (account, time_id)
)
示例数据如下所示

'google', '20180510', '{"gmail_page_viewed" : 12000300, "search_page_viewed" : 9898884726423}'
实际上,我总是想更新(增加计数器)这个表。但是每天的开始时间id(yyyyymmdd)是新的,因此计数器json没有计数器键(例如,
gmail\u页面


因此,我想要的解决方案是在不存在json键列时,创建值为1的新json键列。e、 g.
{“gmail页面已查看”:1}


如果计数器(如查看的gmail页面)键存在,则增加
value=value+1

所以,如果json计数器存在,请帮助我使用update进行insert查询

更新_1(信息:使用json时始终使用IFNULL)

我使用了@wchiquito建议的解决方案,但看到了以下问题

第一次(在模式创建之后);尝试了下面的sql

  INSERT INTO `TAG_COUNTER`
  (`partner_id`, `time_id`, `counters`)
VALUES
  ('google', '20180510', '{"gmail_page_viewed": 1}')
ON DUPLICATE KEY UPDATE `counters` =
  JSON_SET(`counters`,
           '$.gmail_page_viewed',
           JSON_EXTRACT(`counters`,
                        '$.gmail_page_viewed') + 1
  );
并得到以下响应;正如预期的那样,这是正确的

'google', '20180510', '{"gmail_page_viewed": 1}'
然后在下一个查询中尝试使用不同的计数器

  INSERT INTO `TAG_COUNTER`
  (`account`, `time_id`, `counters`)
VALUES
  ('google', '20180510', '{"search_page_viewed": 1}')
ON DUPLICATE KEY UPDATE `counters` =
  JSON_SET(`counters`,
           '$.search_page_viewed',
           JSON_EXTRACT(`counters`,
                        '$.search_page_viewed') + 1
  );
并得到了下面的答案

'google', '20180510', '{"gmail_page_viewed": 1, "search_page_viewed": null}'  
你知道为什么这个新的计数器搜索页面被设置为空吗?

更新_2(信息:当数字用作键时,在键周围使用双引号)

我也遇到了下面的问题,并从这个答案中解决了问题

更新_3(信息:分组依据,确保其中有“非空”或“>0”

获取每个时间帧的计数(例如,按天、月、年)

更新4(问题:)

我想每次查看趋势页面(小时/天/月/年) 从下面的查询中,我可以得到每次的计数,但前提是我知道密钥(gmail页面已查看)

但我想知道的是,我如何知道每次页面计数的总体趋势?因此,我需要以下内容,请帮助

group by SUBSTRING(time_id, 1, 6) AS month, KEY
order by SUM(counters->>'$.KEY') 

以下脚本可能对您的需求有用:

插入“标签”计数器`
(`account`、`time\u id`、`counters`)
价值观
('google'、'20180510'、'gmail_-page_-viewsed:1,'search_-page_-viewsed:50}'),
('google'、'20180510'、'gmail_-page_-viewsed:1,'search_-page_-viewsed:50}'),
('google'、'20180511'、'gmail_-page_-viewsed:1,'search_-page_-viewsed:100}'),
('google'、'20180511'、'gmail_-page_-viewsed:1,'search_-page_-viewsed:100}'),
('google'、'20180511'、'{“gmail页面已浏览”:1,“搜索页面已浏览”:100}')
在重复密钥更新“计数器”时=
JSON_集(`counters`,
“$”已查看gmail页面“,
如果为空(`counters`->'$.gmail\u page\u viewsed',0)+1,
“$”搜索页面“已查看”,
IFNULL(`counters`->'$.“search\u page\u viewsed”',0)+1
);

请参见。

我不确定我是否真的理解您的要求,但是,以下脚本可以给您一些想法,请参见。@wchiquito太棒了!有一个问题您已经更新了
gmail\u页面,但没有更新
搜索页面,但是查看了
?在这种情况下如何更新这两个页面?请参见更新。@wchiquito太棒了!这就是问题所在我想要。谢谢!非常感谢。你能在下面添加这个作为答案,这样我就可以接受了吗?
…SUM(IFNULL(计数器->'$.“gmail页面已查看”,0))…
…IFNULL(计数器->'$.“gmail页面已查看”,0)>0…
。我在遵循解决方案时发现了不同的问题。请您帮助更新好吗?@KanagaveluSugumar:记住根据需要调整脚本,请参阅更新。
  SELECT 
  SUBSTRING(time_id, 1, 6) AS month, 
  SUM(counters->>'$.gmail_page_viewed') 
  FROM TAG_COUNTER 
  WHERE counters->>'$.gmail_page_viewed' > 0
  GROUP BY month;
group by SUBSTRING(time_id, 1, 6) AS month, KEY
order by SUM(counters->>'$.KEY')