SQL-запрос с использованием INSERT INTO ... SELECT и ON DUPLICATE UPDATE (codeigniter 3.x) - PullRequest
1 голос
/ 28 октября 2019

В настоящее время я создаю небольшой инструмент для журналов, и мне трудно работать с таблицами mysql.

Вот мои две таблицы:

CREATE TABLE site_logs
(
    id       int auto_increment,
    level    VARCHAR(45),
    severity varchar(45),
    uri      varchar(255),
    message  VARCHAR(255),
    trace    varchar(255),
    device   varchar(45),
    os       varchar(45),
    browser  varchar(45),
    ip       varchar(45),
    created_ at datetime
);

CREATE TABLE site_logs_stats
(
    id int auto_increment,
    log_id int,
    date datetime,
    count int,

);

Вот ситуация:Каждый час я анализирую свой файл журналов и получаю массив $ result, в котором я получаю каждую ошибку и количество событий в течение часа.

Далее я вставляю значения в таблицу следующим образом:

$result = array_values($result);
            foreach ($result as $res) {

                $this->db->insert('site_logs',array(
                    'level' => $res['level'],
                    'severity' => $res['severity'],
                    'uri' => $res['uri'],
                    'message' => $res['short_message'],
                    'trace' => $res['short_trace'],
                    'device' => $res['device'],
                    'os' => $res['os'],
                    'browser' => $res['browser'],
                    'ip' => $res['ip']
            ));

Что я хочу сделать:

В таблице site_logs я хочу только уникальные ошибки (если есть одна и та же ошибка 14:00 и 16:00, я хочу, чтобы она была записана один раз в этой таблице). Если ошибка получила тот же уровень, серьезность, URI и трассировку, то я считаю, что это та же самая ошибка.

Во второй таблице i история каждой уникальной ошибки ex: если такая же ошибка появляется в 14:00и в 16:00 я хочу иметь site_logs.log_id 2 раза, часы, в которые они записаны, и количество событий во время слота (например, 14:00 -> 15:00 и 15: 00-> 16:00).

Я пробовал много разных запросов, но не смог.

РЕДАКТИРОВАТЬ:

Теперь я вставляю данные в таблицу site_logs:

$result = array_values($result);
            foreach ($result as $res) {
                $this->db->replace('site_logs',array(
                    'level' => $res['level'],
                    'severity' => $res['severity'],
                    'uri' => $res['uri'],
                    'message' => $res['short_message'],
                    'trace' => $res['short_trace'],

            ));

с уникальным ключом для идентификатора, он, кажется, работает довольно хорошо, я удалил другие поля для более легкой сортировки и избегаю дублирования, кроме как через ip / browser и т. д. Так что теперь я работаю над второй частью, где я должен вставить site_logs. id в site_log_stats и подсчитывать количество событий каждый час. (Я думаю о 'last_insert' или о чем-то вроде этого.

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