JSON Вставить в таблицу MySQL или обновить, если существует - PullRequest
0 голосов
/ 10 мая 2018

Это продолжение Вставка в таблицу MySQL или обновление, если существует , но на этот раз я хочу обновить запись json в mysql

Ниже приведена схема:

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}"

На самом деле я всегда хочу обновить (увеличить счетчик) этой таблицы.но каждый день start time_id (yyyyMMdd) является новым, поэтому счетчик json не имеет ключа счетчика (например, gmail_page_viewed).


Итак, я хочу создать новый столбец ключей json с
value = 1, когда он не существует.например, {"gmail_page_viewed" : 1}


, если существует ключ счетчика (например, gmail_page_viewed), затем увеличить
value = value + 1

. Так что помогите мне в запросе вставки с обновлением, если счетчик jsonсуществует.

UPDATE_1 (ИНФОРМАЦИЯ: Всегда используйте IFNULL при работе с json)

Я использовал решение, предложенное @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') 

1 Ответ

0 голосов
/ 10 мая 2018

Следующий скрипт может быть полезен для вашего требования:

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

См. dbfiddle .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...