Недавно я создал новый веб-сайт на основе codeigniter 3-php и PHPMyADMIN-mysql, и я интегрировал на одну страницу больше, чем динамический поиск с помощью ajax.
Моя проблема в том, что когда у меня более 1 миллиона 500 тысяч результатов, запрос начинает тратить много времени.
И для этого решения я рассмотрел использование триггеров.
Поэтому у меня есть небольшая проблема, когда я использую триггеры: когда я пытаюсь создать динамический фильтр, я делаю пример, чтобы лучше понять, я хочу знать количество строк, соответствующих фильтру, хранящемуся в другой динамической таблице.
BEGIN
UPDATE max_tare
SET max_row = (SELECT COUNT(*)FROM history
IF(new.client != '') THEN
WHERE nom LIKE CONCAT('%', NEW.client, '%') END IF;
IF(new.commune != '') THEN
WHERE commune LIKE CONCAT('%', NEW.commune, '%') END IF;
IF(new.type != '') THEN
WHERE type LIKE CONCAT('%', NEW.type, '%') END IF;
IF(new.matricule != '') THEN
WHERE mat LIKE CONCAT('%', NEW.matricule, '%') END IF;
IF(new.tare != '') THEN
WHERE tare LIKE CONCAT('%', NEW.tare, '%') END IF;
WHERE cancled = 0),
max_tare =(SELECT SUM(tare) FROM history
WHERE cancled = 0) WHERE id = 1;
END
Проблема в том, что, если я удаляю все условия ifs statement
, мой фильтр не будет работать, если мой фильтр содержит пустое поле, он разбивает результат до 0, я хочу, если его пустое поле не считается как параметр фильтрации.
Я попробовал также заявления случая это также не помогает.
Когда я запускаю код, я получаю сообщение об ошибке:
MySQL ответил: # 1064 - Синтаксическая ошибка возле 'IF
' (new.client! = '') THEN
ГДЕ ИМЯ КАК КОНКАТ ('%', NEW.client, '%') END IF
;
Существует какое-то долгое решение, которое работает, но мне оно не нужно, потому что я не могу назвать его решением:
Это для извлечения снаружи и выбора для каждого полученного случая, другими словами:
if (client! = 0 and common == 0 and type == 0 and number == 0 and tare == 0) then
{filter by client only}
otherwise-if (client! = 0 and common! = 0 and type == 0 and number == 0 and tare == 0) then
{filter by client and common only} .... ect
Я постараюсь сделать пример, чтобы сделать его более понятным:
Это моя таблица истории:
| history |
+----+-------------+---------+--------+--------------+-------+---------+---------+
| id | nom | commune | type | mat | tare | rfid | cancled |
+----+-------------+---------+--------+--------------+-------+---------+---------+
| 1 | EPIC paris | france | white | 01248-816-16 | 7600 | ABCF44C | 0 |
+----+-------------+---------+--------+--------------+-------+---------+---------+
| 2 | EPIC london | UK | white | 06854-315-16 | 5233 | A8CG27C | 1 |
+----+-------------+---------+--------+--------------+-------+---------+---------+
| 3 | NET barça | ESP | red | 03254-615-16 | 8900 | HBC54AC | 1 |
+----+-------------+---------+--------+--------------+-------+---------+---------+
| 4 | NET Dubai | arab | blue | 35251-117-16 | 11200 | HDK7BV5 | 0 |
+----+-------------+---------+--------+--------------+-------+---------+---------+
| 5 | EPIC roma | ita | red | 36524-618-16 | 7300 | NBL53DC | 0 |
+----+-------------+---------+--------+--------------+-------+---------+---------+
| 6 | SNC beta | alpha | green | 69358-117-16 | 5400 | JDLF8ND | 1 |
+----+-------------+---------+--------+--------------+-------+---------+---------+
| 7 | EPIC tokyo | japan | yellow | 46258-712-16 | 8700 | K5ND55D | 1 |
+----+-------------+---------+--------+--------------+-------+---------+---------+
| 8 | SARL Fit | body | black | 69531-614-16 | 9600 | AIES5HJ | 0 |
+----+-------------+---------+--------+--------------+-------+---------+---------+
Я хочу получить количество строк, содержащих cancled = 0
, и в их названии есть EPIC
Итак, мой массив файлов будет выглядеть так:
| temp_fetch |
+----+--------+---------+------+--------------+------+
| id | client | commune | type | matricule | tare |
+----+--------+---------+------+--------------+------+
| 1 | EPIC | | | | |
+----+--------+---------+------+--------------+------+
В результате у меня должно получиться что-то вроде этого
| max_tare |
+----------------------------+
| id | max_row | max_tare |
+----+------------+----------+
| 1 | 2 | 14900 |
+----+------------+----------+
Если это поможет, я положу туда свой php-код, который работает, но требует слишком много для загрузки результатов
$this->db->from('history');
if ($query[1] != '') {
$this->db->like('nom', $query[1]);
}
if ($query[2] != '') {
$this->db->like('commune', $query[2]);
}
if ($query[3] != '') {
$this->db->like('type', $query[3]);
}
if ($query[4] != '') {
$this->db->like('mat', $query[4]);
}
if ($query[10] != '') {
$this->db->like('rfid', $query[10]);
}
if ($query[5] != '') {
$this->db->like('tare', $query[5]);
}
if ($query[6] != '') {
$this->db->where('date >', $query[6]);
}
if ($query[7] != '') {
$this->db->where('date <', $query[7]);
}
if ($query[11] != '') {
$this->db->where('time_plode >', $query[11]);
}
if ($query[12] != '') {
$this->db->where('time_plode <', $query[12]);
}
$this->db->where('cancled', 0);
return $this->db->count_all_results();