MySql Inner JSON Вставить или обновить, если существует

В соответствии с этим JSON Вставить в таблицу MySQL или обновить, если существует я получил ответ mysql, чтобы вставить / обновить приведенный ниже файл json.

"google", 
"20180510", 
"{
   "gmail_page_viewed" : 12000300, 
   "search_page_viewed" : 9898884726423
 }"

в СХЕМУ

CREATE TABLE TAG_COUNTER (
    account       varchar(36) NOT NULL,
    time_id       INT NOT NULL,
    counters      JSON,
    PRIMARY KEY   (account, time_id)
)

как показано ниже

INSERT INTO `TAG_COUNTER`
  (`account`, `time_id`, `counters`)
VALUES
  ('google', '20180510', '{"gmail_page_viewed": 1, "search_page_viewed": 1}'),
  ('google', '20180510', '{"gmail_page_viewed": 1, "search_page_viewed": 1}'),
  ('google', '20180511', '{"gmail_page_viewed": 1, "search_page_viewed": 1}'),
  ('google', '20180511', '{"gmail_page_viewed": 1, "search_page_viewed": 1}'),
  ('google', '20180512', '{"gmail_page_viewed": 1, "search_page_viewed": 1}')
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
  );

Однако получить данные из него с помощью group by сложно, поскольку ключ json является динамическим, а не статическим.

Поэтому, если я изменю свой json, чтобы иметь статические ключи (например, page_name, page_visits) в формате ниже, сделать поиск (groupby / orderby) будет легко.

"google", 
"20180510", 
'{
   "gmail_page_viewed" : {"page_name" : "gmail_page_viewed", "page_visits" : 12000300}, 
   "search_page_viewed" : {"page_name" : "search_page_viewed", "page_visits" : 12000300}
 }"

Но я не мог понять, как подготовить запрос INSERT ON DUPLICATE KEY UPDATE. Я пытался более 6 часов, но не повезло: либо данные не вставлены должным образом, либо счетчик посещений не обновляется должным образом. иногда цитата добавляется в содержание.

Может ли кто-нибудь помочь мне в этом?

ON DUPLICATE KEY UPDATE требует УНИКАЛЬНЫЙ ключ на вашем столе. У вас он есть?
Raymond Nijland 14.05.2018 16:38

@RaymondNijland Да, я обновил схему в вопросе.

Kanagavelu Sugumar 14.05.2018 16:44

Я не понимаю всей проблемы, но следующий запрос может дать вам некоторые идеи, см. dbfiddle.

wchiquito 14.05.2018 18:02

@wchiquito Спасибо, я проверю вас. Одна вещь, которую я вижу, обновление включает только посещения страницы, поэтому, когда новый тег появляется после уже записанной / тега, я думаю, не будет обновлять имя, но обновит вас после тестирования.

Kanagavelu Sugumar 14.05.2018 20:27

@wchiquito Спасибо !! и ваше решение почти такое же, как я просил. Но когда учетная запись и time_id совпадают и при попытке вставить новый другой тег, он не обновляется должным образом. Это связано с тем, что для этого первичного ключа уже создана строка, а следующая вставка / обновление строки не выполняется. dbfiddle.uk/…

Kanagavelu Sugumar 15.05.2018 02:15

Попробуйте dbfiddle.

wchiquito 15.05.2018 13:19

@wchiquito Как обычно выглядит то, что мне нужно. Спасибо!! Одно сомнение, как был добавлен "page_name": "g_page_viewed", если он не входит в состав JSON_SET? есть только упоминание о page_visits после / под разделом JSON_SET.

Kanagavelu Sugumar 15.05.2018 18:18
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
7
142
0

Другие вопросы по теме