Это продолжение Вставка в таблицу 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')