JSON插入MySQL表或更新(如果存在)
这是的继续,但这次我想更新mysql中的json条目 以下是模式: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"
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')