У меня есть база данных mysql и структура таблиц, подобная этой:
CREATE TABLE `user_session_log` (
`stat_id` int(8) NOT NULL AUTO_INCREMENT,
`metric` tinyint(1) NOT NULL DEFAULT '0',
`platform` tinyint(1) NOT NULL DEFAULT '0',
`page_id` varchar(128) DEFAULT '_empty_',
`target_date` date DEFAULT NULL,
`country` varchar(2) DEFAULT NULL COMMENT 'ISO 3166 country code (2 symbols)',
`amount` int(100) NOT NULL DEFAULT '0.000000' COMMENT 'counter or amount',
`unique_key` varchar(180) DEFAULT NULL COMMENT 'Optional unique identifier',
`created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`stat_id`),
UNIQUE KEY `unique_key` (`unique_key`) USING BTREE,
KEY `target_date` (`target_date`)
) ENGINE=InnoDB AUTO_INCREMENT=21657473 DEFAULT CHARSET=utf8
Я пытаюсь добиться регистрации активных сессий / уникальных пользователей на основе даты, page_id и страны.,В настоящее время я могу добиться этого, генерируя несколько операторов вставки с помощью unique_key, покупая добавляя page_id и дату в уникальном ключе, но я хочу что-то немного другое.Логика должна быть следующей: вставить новую строку unique_key (полууникальный идентификатор пользователя), где country = this, date = this, page_id = this.Если уже есть строка с такой информацией (тот же page_id, unique_key и date + country) - обновите сумму = (сумма) + 1;(Сессия).Так что я мог бы сделать поиск как:
SELECT sum(amount) WHERE page_id = "something" AND target_date = "2018-12-21"
Это дало бы мне несколько сеансов.ИЛИ:
SELECT COUNT(*) WHERE page_id = "something" AND target_date = "2018-12-21"
Это даст мне количество активных пользователей на этом pagee_id в этот день ИЛИ:
SELECT COUNT(*) WHERE target_date = "2018-12-21"
, что даст мне общее количество пользователей за этот день.Я знаю об уникальном индексе, но даст ли он результат, который я ищу?
Правка, образец вставки: INSERT INTO `user_session_log` (`platform`,`page_id`,`target_date`,`country`,`amount`,`unique_key`,`created`,`modified`) VALUES ('1','page_id_54','2018-10-08','US',1,'ea3d0ce0406a838d9fd31df2e2ec8085',NOW(),NOW()) ON DUPLICATE KEY UPDATE `amount` = (amount) +1, `modified` = NOW();
и таблица должна знать, есть ли дубликат на основе того же уникального ключа + дата + страна + платформа + page_id, в противном случае просто вставьте новую строку.Прямо сейчас я делаю это по-другому, сгенерировав разные метрики и ключ unique_key, уже содержащий дату + page_id и затем хэшированный.таким образом, он уникален благодаря тому, что я могу фильтровать разных уникальных пользователей в течение дня, но я не могу отфильтровать количество сеансов, которые имел уникальный пользователь, или как долго он использует программное обеспечение и тому подобное.