mariadbjson删除键及其值

mariadbjson删除键及其值,mariadb,key,remove,mysql-json,mariadb-10.4,Mariadb,Key,Remove,Mysql Json,Mariadb 10.4,我有一张桌子,可能是这样的 CREATE TABLE `saved_links` ( `link_entry_id` bigint(20) NOT NULL AUTO_INCREMENT, `link_id` varchar(30) COLLATE utf8mb4_unicode_ci NOT NULL, `user_data_json` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL, PRIMARY KEY (`l

我有一张桌子,可能是这样的

CREATE TABLE `saved_links` (
 `link_entry_id` bigint(20) NOT NULL AUTO_INCREMENT,
 `link_id` varchar(30) COLLATE utf8mb4_unicode_ci NOT NULL,
 `user_data_json` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
PRIMARY KEY (`link_entry_id`),
 UNIQUE KEY `link_id` (`link_id`)
) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='saved Links'
和插入

INSERT INTO `saved_links`(`link_id`, `user_data_json` ) 
VALUES ( 
        'AABBCC',  
        '[{
            "mama@gmail_DOT_com": {"u_email": "mama@gmail_DOT_com", "private": "no"}}, 
          {
           "papa@gmail_DOT_com": {"u_email": "papa@gmail_DOT_com", "private": "no"}},
          {
           "daughter@gmail_DOT_com": {"u_email": "daughter@gmail_DOT_com", "private": "no"}},
          {
           "son@gmail_DOT_com": {"u_email": "son@gmail_DOT_com", "private": "no"}
        }]'  
    ), ( 
        'DDEEFF',  
            '[{
               "mama@gmail_DOT_com": {"u_email": "mama@gmail_DOT_com", "private": "no"}}, 
              {
               "papa@gmail_DOT_com": {"u_email": "papa@gmail_DOT_com", "private": "no"}} 
               
               ]'  
    ) ;
选择*

---------------------------------------------------
`link_id` | `user_data_json` 
----------------------------------------------------
`AABBCC` | [{
         |         "mama@gmail_DOT_com": {"u_email": "mama@gmail_DOT_com", "private": "no"}}, 
         |         {
         |          "papa@gmail_DOT_com": {"u_email": "papa@gmail_DOT_com", "private": "no"}},
         |         {
         |          "daughter@gmail_DOT_com": {"u_email": "daughter@gmail_DOT_com", "private": "no"}},
         |         {
         |          "son@gmail_DOT_com": {"u_email": "son@gmail_DOT_com", "private": "no"}}]
---------------------------------------------------------------------------------------------  
`DDEEFF` | [{
         |         "mama@gmail_DOT_com": {"u_email": "mama@gmail_DOT_com", "private": "no"}}, 
         |         {
         |          "papa@gmail_DOT_com": {"u_email": "papa@gmail_DOT_com", "private": "no"}}
         |         ]
---------------------------------------------------------------------------------------------    

     
我想删除
”papa@gmail_DOT_com“
和他所有的
来自
AABBCC

我已经尝试过(我正在使用10.4.15-MariaDB)

这是回报

 ---------------------------------------------------
    `link_id` | `user_data_json` 
    ----------------------------------------------------
    `AABBCC` | [{
             |         "mama@gmail_DOT_com": {"u_email": "mama@gmail_DOT_com", "private": "no"}}, 
             |         {}, //-> Notice these empty braces that are left behind.
             |         {
             |          "daughter@gmail_DOT_com": {"u_email": "daughter@gmail_DOT_com", "private": "no"}},
             |         {
             |          "son@gmail_DOT_com": {"u_email": "son@gmail_DOT_com", "private": "no"}}]
有没有办法避免删除后出现空的
{}

更新01-如果您尝试:

UPDATE `saved_links` SET 
`user_data_json` = 
      JSON_REMOVE(`user_data_json`, '$.papa@gmail_DOT_com') 
 WHERE  `link_id`= 'AABBCC'
这将删除列
user\u data\u json
中的所有数据,其中
link\u id
='AABBCC'`

谢谢

从保存的链接中选择json(用户数据json,$[1]),其中链接条目id=19

将返回:

[{"mama@gmail_DOT_com": {"private": "no", "u_email": "mama@gmail_DOT_com"}},
 {"daughter@gmail_DOT_com": {"private": "no", "u_email": "daughter@gmail_DOT_com"}},
 {"son@gmail_DOT_com": {"private": "no", "u_email": "son@gmail_DOT_com"}}]
我不是真的在使用JSON,而是从第二个示例中得到了灵感:

编辑:

您可以对此进行优化:

with recursive abc as (
  Select 0 as i 
  union all 
  select i+1 from abc where i<2) 
select link_entry_id, link_id,i, json_keys(user_data_json,concat('$[',i,']')) 
from saved_links,abc;
有了它,您可以“转换”
“papa@gm....“
1

编辑2: 组合来自或来自的不同JSON函数可以做很多事情:

SELECT 
   j.person,
   JSON_KEYS(j.person), 
   JSON_EXTRACT(JSON_KEYS(j.person),'$[0]'), 
   JSON_UNQUOTE(JSON_EXTRACT(JSON_KEYS(j.person),'$[0]')),
   JSON_VALUE(JSON_KEYS(j.person),'$[0]')
FROM 
   JSON_TABLE('[{
            "mama@gmail_DOT_com": {"u_email": "mama@gmail_DOT_com", "private": "no"}}, 
          {
           "papa@gmail_DOT_com": {"u_email": "papa@gmail_DOT_com", "private": "no"}},
          {
           "daughter@gmail_DOT_com": {"u_email": "daughter@gmail_DOT_com", "private": "no"}},
          {
           "son@gmail_DOT_com": {"u_email": "son@gmail_DOT_com", "private": "no"}
        }]', 
                  '$[*]' COLUMNS(person JSON PATH '$[0]')) j
                  

输出(请向右滚动,最后一列比第一列有趣我已经玩了一段时间这个拼图,我想用另一种方法来做。 您可以使用json_search(加上其他函数)最终使用json_remove。 一旦创建了JSON数组,就必须考虑您的设计决定是否按原样上传数据。 这是我的代码:

UPDATE saved_links sl 
SET user_data_json = 
JSON_REMOVE(user_data_json, 
    SUBSTRING_INDEX( 
        JSON_UNQUOTE( 
            JSON_SEARCH(sl.user_data_json,'one','papa@gmail_DOT_com') 
        )
    ,'.', 1) 
)
WHERE link_id='AABBCC'
  • json\u搜索(sl.user\u data\u json,'one','papa@gmail_DOT_com)

    • 返回<代码>“$[1]。papa@gmail_DOT_com.u_email“
  • JSON\u UNQUOTE

    • 返回
      $[1]。papa@gmail_DOT_com.u_email
  • SUBSTRING\u索引(@JSON,'.',1)

    • 返回
      $[1]
  • 最后,您将使用最后一个返回作为JSON_移除路径


  • 我不知道你的JSON密钥是否总是与u_电子邮件相同,但如果它是真的,那么你可以使用它。

    使用?已经使用过…请参阅我在帖子中尝试的内容。我编辑了标记,因为你使用的是MariaDB,而不是MySQL。这两个产品对JSON数据有不同的实现。它们不应被视为同一个数据库产品。@BillKarwin谢谢你。虽然我仍然卡住了。如果你有任何想法,请告诉我谢谢,但我避免使用
    “$[N]“
    索引,因为条目的顺序不可预测……第一封电子邮件可能
    son@gmail_DOT_com
    ,第二个可能是
    grandpa@gmail_DOT_com
    因此,如果您根据数组索引删除,您可能会删除错误的条目,因为它们是随机插入的好书,但从
    PHP
    我需要传递
    $email
    MySql查询中
    …知道如何在
    MySql查询中使用此递归方法传递
    PHP
    变量
    吗?我添加了
    EDIT2
    。另一种方法是创建为了测试???…再次感谢
    SELECT 
       j.person,
       JSON_KEYS(j.person), 
       JSON_EXTRACT(JSON_KEYS(j.person),'$[0]'), 
       JSON_UNQUOTE(JSON_EXTRACT(JSON_KEYS(j.person),'$[0]')),
       JSON_VALUE(JSON_KEYS(j.person),'$[0]')
    FROM 
       JSON_TABLE('[{
                "mama@gmail_DOT_com": {"u_email": "mama@gmail_DOT_com", "private": "no"}}, 
              {
               "papa@gmail_DOT_com": {"u_email": "papa@gmail_DOT_com", "private": "no"}},
              {
               "daughter@gmail_DOT_com": {"u_email": "daughter@gmail_DOT_com", "private": "no"}},
              {
               "son@gmail_DOT_com": {"u_email": "son@gmail_DOT_com", "private": "no"}
            }]', 
                      '$[*]' COLUMNS(person JSON PATH '$[0]')) j
                      
    
    UPDATE saved_links sl 
    SET user_data_json = 
    JSON_REMOVE(user_data_json, 
        SUBSTRING_INDEX( 
            JSON_UNQUOTE( 
                JSON_SEARCH(sl.user_data_json,'one','papa@gmail_DOT_com') 
            )
        ,'.', 1) 
    )
    WHERE link_id='AABBCC'