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密钥是否总是与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'