Я пытаюсь создать процедуру, которая будет принимать таблицу представлений, составленную из тысяч записей, и фильтровать ее, удаляя несколько записей в соответствии с различными условиями.
Когда я пытаюсь использовать CALL длязапустить его, он продолжает загружаться, и, согласно WHM Panel, этот процесс (phpMyAdmin / import.php) занимает около 90% мощности процессора.В конце концов это может произойти сбой, возможно, через 10 минут из-за тайм-аута:
Статический анализ:
1 Во время анализа были обнаружены ошибки.
Отсутствует выражение.(около «ON» в позиции 25) SQL-запрос: Edit Edit
SET FOREIGN_KEY_CHECKS = ON;
MySQL сказал: Документация
2006 - сервер MySQL пропал
Я использую следующий код, а новая таблица представлений использует 3 таблицы БД:
vw_r2_items_tr
, использует таблицу ядра БД tr
и vw_items
- таблица представления, которая использует items
и visits
основные таблицы
DELIMITER $$
CREATE VIEW `vw_r2_items_tr` AS
SELECT
IF((`i`.`id` = `t`.`item_ord`),1,0) AS `has_tr`,
`i`.`calculated_score` AS `calculated_score`,
`i`.`visited_at` AS `visited_at`,
`i`.`ip_address` AS `ip_address`,
`i`.`user_id` AS `user_id`,
`i`.`visit_id` AS `visit_id`,
`i`.`product_id` AS `product_id`,
`i`.`name` AS `name`,
`i`.`id` AS `id`,
`i`.`item_no` AS `item_no`,
FROM (`vw_items` `i`
LEFT JOIN `trs` `t`
ON (((`t`.`visit_id` = `i`.`visit_id`)
AND (`t`.`item_ord` = `i`.`id`))))$$
DELIMITER ;
DELIMITER $$
CREATE PROCEDURE `vw_unique_trs2`()
BEGIN
SET @vat=0;
SET @ht=0;
SET @tdiff=0;
-- EXPLAIN
SELECT
COUNT(*) AS ct,
tb1.* FROM (SELECT it.*, @tdiff:=UNIX_TIMESTAMP(CONVERT_TZ(it.visited_at,'+00:00',@@global.time_zone)) AS tdiffs,
IF(@vat > 0 AND ((@vat-@tdiff) < 28800 AND (@vat-@tdiff) > -28800),@vat DIV 28800, @tdiff DIV 28800) AS diff,
@ht:=(IF(@vat > 0 AND ((@vat-@tdiff) < 28800 AND (@vat-@tdiff) > -28800),@ht+has_tr,has_tr)) hts,
@vat:=(IF(@vat > 0 AND ((@vat-@tdiff) < 28800 AND (@vat-@tdiff) > -28800),@vat,@tdiff)) curr_vat
FROM (SELECT * FROM (SELECT * FROM `vw_r2_items_tr` ORDER BY has_tr DESC, item_no, visited_at) AS tb
GROUP BY `tb`.`visit_id`,`tb`.`product_id`) AS it
ORDER BY has_tr DESC, it.visited_at DESC
) AS tb1
GROUP BY user_id, calculated_score, diff, hts;
END$$
DELIMITER ;