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

2023-12-02

这是继续插入 MySQL 表或更新(如果存在),但是这次我想更新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}'

实际上我总是想更新(增加计数器)这个表。但每天的开始 time_id(yyyyMMdd) 都是新的,因此计数器 json 没有计数器键(例如gmail_page_viewed).


所以我想要的解决方案是创建新的 json 键列
value = 1当它不存在时。例如{"gmail_page_viewed" : 1}


如果计数器(例如gmail_page_viewed) 键存在然后递增
value = value + 1

因此,如果 json 计数器存在,请帮助我进行插入查询和更新。

UPDATE_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}'  

知道为什么这个新计数器 search_page_viewed 设置为 NULL ..?

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

我也遇到了以下问题,并从该答案中解决了它

Mysql 5.7 错误 3143 (42000):无效的 JSON 路径表达式。错误发生在字符位置 3 附近

UPDATE_3(信息:分组依据,确保 WHERE 为“NOT NULL”或“> 0”

获取每个时间范围的计数(例如按日、月、年)

  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;

UPDATE_4(问题:)

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

  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') 

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

INSERT INTO `TAG_COUNTER`
  (`account`, `time_id`, `counters`)
VALUES
  ('google', '20180510', '{"gmail_page_viewed": 1, "search_page_viewed": 50}'),
  ('google', '20180510', '{"gmail_page_viewed": 1, "search_page_viewed": 50}'),
  ('google', '20180511', '{"gmail_page_viewed": 1, "search_page_viewed": 100}'),
  ('google', '20180511', '{"gmail_page_viewed": 1, "search_page_viewed": 100}'),
  ('google', '20180511', '{"gmail_page_viewed": 1, "search_page_viewed": 100}')
ON DUPLICATE KEY UPDATE `counters` =
  JSON_SET(`counters`,
           '$."gmail_page_viewed"',
           IFNULL(`counters` ->> '$."gmail_page_viewed"', 0) + 1,
           '$."search_page_viewed"',
           IFNULL(`counters` ->> '$."search_page_viewed"', 0) + 1
  );

See dbfiddle.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JSON 插入 MySQL 表或更新(如果存在) 的相关文章

随机推荐

  • DataGridView 中的总计行

    我正在开发一个winform应用程序 我想显示每列最后一行的列总和 该行必须始终可见 目前 我正在考虑在带有记录的数据网格视图下方添加另一个数据网格视图 并将在底部数据网格视图中显示总和 如果有更好的方法来完成这个任务吗 不 需要添加另一个
  • 删除 geom_text 中的重复标签

    我的数据如下所示 composerName season Location Time Venue eventType id conductorName interval movement workTitle 1 Anthem 1918 19
  • Magento 1.6,Google 购物/产品/内容

    Magento 1 6 于本周初发布 但使用 mage googleshopping 扩展 http www magentocommerce com magento connect Magento Core extension 6887 m
  • 编译 Play 应用程序时出现的问题

    我在编译 Play 框架应用程序时遇到了一些问题 有时应用程序运行良好 但大多数时候这些问题都是在 sbt 和 activator 工具中发生的 这是使用 sbt 编译我的应用程序的示例 info Compiling 15 Scala so
  • Objective C 类方法返回值,分配给弱/强属性

    我面临着一些涉及弱属性和强属性的困惑 为了简洁起见 我不会包含整个代码 我创建了一个返回 UIView 对象的类便捷方法 并在 UIView 类别中实现了它作为子类化的替代方法 implementation UIView CSMonthVi
  • 使用 CUT 和 Quartile 在 R 函数中生成中断

    下列的之前的一些很好的建议 我现在正在编写第二个 R 函数并使用类似的逻辑 然而 我正在尝试更多地自动化 但可能变得太聪明了 不利于我自己 我想根据订单数量将客户分成五分位数 这是我执行此操作的代码 sample data clientID
  • 如何在 apache Camel Rest api 中进行自定义错误处理?

    我有一个 apache Camel Rest api 它从 S3 下载文件 我发送 json 输入 key bucketname accessKey secretKey region 以便写入 URI 代码如下所示 public stati
  • vba 循环中出现类型不匹配错误

    我正在 Outlook VBA 中工作 并构建了一个 For Next 循环来读取 MailItems 的正文 其格式类似于 Key Value 对 在某种程度上 它似乎有效 但在第二次迭代结束时 当它到达 下一个项目 时 我收到抛出 类型
  • 阻止传出短信

    如果短信包含根据数据库过滤的单词 如何阻止传出短信 我可以监控发送的消息是否包含已过滤的单词 但我无法阻止短信 您无法停止手机上默认消息发送应用程序发送短信 为此 您必须创建自己的短信盒应用程序 然后才能向其中添加自定义功能
  • 如何使用 Bundle 在 Activity 之间传递 Uri 数组

    我需要将 Uri 数组传递给另一个活动 传递一个我简单使用的字符串数组 String images getImagesPathString Bundle b new Bundle b putStringArray images images
  • 如何向 UIToolBar 添加图像?

    我想将图像添加到用户无法与之交互的 UIToolBar 它本质上只是一个非交互式指示器 就像徽章一样 这可能吗 如果是这样 怎么办 创建一个UIBarButtonItem使用图像并添加它 Example UIBarButtonItem it
  • 处理按钮外部的点击事件

    我正在尝试通过重现 Apple AppStore 中的应用程序来练习 C 在应用程序中 有一个带有文本的矩形 Touch me 当您触摸它时 矩形会自行重新定位 执行此操作几次后 文本将更改为 不要碰我 在这种情况下 您必须触摸矩形之外 一
  • Pyspark 向数据帧添加顺序和确定性索引

    我需要向数据帧添加一个索引列 并具有三个非常简单的约束 从0开始 是连续的 具有确定性 我确信我错过了一些明显的东西 因为我发现的例子对于这样一个简单的任务来说看起来非常复杂 或者使用非顺序 非确定性越来越单调的 id 我不想使用索引进行压
  • 在 Swift 2 中对字典数组进行排序

    我读过很多关于SO的文章 但我仍然感到困惑 我有一系列字典 见下文 var myArray String AnyObject myArray append caseNumber 12349 formType Advanced caseSta
  • python 将本地时间字符串转换为 UTC 纪元时间戳

    我有 YMD hms 格式的字符串 其中删除了时区 但我知道他们现在是东部时间 有夏令时 我正在尝试将它们转换为 UTC 时间的纪元时间戳 我写了以下函数 def ymdhms timezone dst to epoch input str
  • Java Apache POI 打开文件? [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我有一个 Java 程序 可以编辑现有的 Excel 文件并将其另存为新文件 但是 我还希望程序在结束时自动打开新创建的文件 是否有 apache poi 命令可以让我执行此操作 由
  • Rails ActionMailer 中的 Net::SMTPAuthenticationError 502 5.5.2

    我正在尝试向用户发送确认电子邮件 但我收到以下错误 Net SMTPAuthenticationError 502 5 5 2 错误 命令无法识别 Production rb中的配置如下 Disable delivery errors ba
  • 原型声明和前向声明之间的区别?

    所以我有这个代码 class xx int getnum Is this a forward declaration or a prototype declaration and why int xx getnum return 1 3 所
  • 在 Ubuntu 14.10 中安装 OpenCV

    我正在尝试根据以下方法在 Ubuntu 14 10 中安装 OpenCV操作说明 我安装了所有提到的依赖项 但是当我尝试运行时make我收到这样的错误 home ilia opencv 2 4 8 modules highgui src f
  • JSON 插入 MySQL 表或更新(如果存在)

    这是继续插入 MySQL 表或更新 如果存在 但是这次我想更新mysql中的json条目 下面是架构 CREATE TABLE TAG COUNTER account varchar 36 NOT NULL time id INT NOT