Можно ли это сделать запросом?

123
AS
На сайте с 12.12.2017
Offline
6
#11
Dram:
А если нет - как добавить условие чтобы затронуло только тех у кого есть комменты?

Тогда так:

update firm set created = IFNULL(DATE_SUB((select min(comments.created) from comments where firm.Id = object_id group by object_id), INTERVAL 1 MONTH), firm.created);

H
На сайте с 21.08.2004
Offline
122
#12
Dram:
Не вижу в вашем варианте "минус месяц" от даты коммента при обновлении поля крейтед у фирмы

ну -/+ вы можете добавить сами:) - я только принцип описал (выше написали как менять дату DATE_SUB)

Есть что-то, что мы не знаем, но узнать это мы не можем.
D
На сайте с 28.06.2008
Offline
1104
#13

Синтаксис неправильный, мускуль ругается

#1054 - Неизвестный столбец 'comments.created' в 'field list'

Вероятно нужно как то назначить таблицы по типу

база.firm AS t2 и т.п. , пробую найти примеры...

H
На сайте с 21.08.2004
Offline
122
#14
Dram:
Синтаксис неправильный, мускуль ругается

Вероятно нужно как то назначить таблицы по типу
база.firm AS t2 и т.п. , пробую найти примеры...

имя поля правильное подставьте (дата из таблицы комментов)

D
На сайте с 28.06.2008
Offline
1104
#15

перепроверил все, да была ошибка, все поправил в итоге запрос

update firm set created = IFNULL(DATE_SUB((select min(comments.created) from comments where firm.Id = object_id group by object_id), INTERVAL 1 MONTH), firm.created);

как завис на минуту с чем то так и вывалился с ошибокой 504 по тайтауту.

Решил я проверить на одной фирме добавив в запрос

and firm.id = 11004

все равно запрос завис и ничем не закончился

P.S. таблица комментов большая (более 300k записей), но почему даже по одной фирме запрос не отработал

H
На сайте с 21.08.2004
Offline
122
#16

попробуйте просто селект/EXPLAIN сделать и посмотрите что там у вас с индексами.

select * from comments where firm_id=some_id order by data_comment

есть ли покрывающий индекс по firm_id и data comment для таблицы comments?

D
На сайте с 28.06.2008
Offline
1104
#17

Эти таблицы проиндексированы в доль и поперек ибо они самые ходовые на сайте. На всех полях индексы есть.

Эксплейн показывает что на скрине.

P.S. я попробовал добавить условие

where `object_group` = 'avto'

решил обновлять по категориям. Эксплейн тут же показал сокращение графы DEPENDENT SUBQUERY с 300K до 4 !!!! Но все равно запрос виснет

png 170723.png
D
На сайте с 28.06.2008
Offline
1104
#18

Попробовал выполнить эксплейн части запроса

select min(comments.created) from `comments` where `object_group` = 'avto'

В итоге -

rows - 149941 Using index condition

Если я правильно понимаю. Запрос виснет потому что кол-во фирм умножаются на 149941

в результате запрос пытается перебрать 3 млрд.!!! строк? Я все верно понял?

---------- Добавлено 29.01.2018 в 13:44 ----------

Можно по другому:

1. Найти все фирмы, у которых поле created младше чем самый старый коммент,

например created = 2015-07-10 16:20:00

а самый старый коммент для фирмы с created = 2013-07-10 16:20:00

2. Обновить created у этих фирм сделав его на месяц старше самого старого коммента

H
На сайте с 21.08.2004
Offline
122
#19
Dram:
Эти таблицы проиндексированы в доль и поперек ибо они самые ходовые на сайте. На всех полях индексы есть.
Эксплейн показывает что на скрине.

P.S. я попробовал добавить условие
решил обновлять по категориям. Эксплейн тут же показал сокращение графы DEPENDENT SUBQUERY с 300K до 4 !!!! Но все равно запрос виснет

так в подзапросе индексов нет/ не используется (using where - получаем все записи, потом начинаем "фильтровать" условие).

select min(comments.created) from `comments` where `object_group` = 'avto'

а где условие группировки?

скиньте скрипт создания таблицы (с индексами)

D
На сайте с 28.06.2008
Offline
1104
#20

CREATE TABLE `comments` (

`id` int(11) NOT NULL,

`object_group` varchar(32) NOT NULL,

`object_id` int(11) NOT NULL,

`created` datetime NOT NULL,

`ip` varchar(64) NOT NULL,

`user_id` int(11) NOT NULL,

`rate` int(11) NOT NULL,

`country` varchar(64) NOT NULL,

`status` int(11) NOT NULL,

`username` varchar(128) NOT NULL,

`email` varchar(64) NOT NULL,

`isgood` int(11) NOT NULL,

`ispoor` int(11) NOT NULL,

`description` text NOT NULL,

`revision` int(11) NOT NULL,

`links` text NOT NULL,

`images` int(11) NOT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--

-- Индексы сохранённых таблиц

--

--

-- Индексы таблицы `comments`

--

ALTER TABLE `comments`

ADD PRIMARY KEY (`id`),

ADD KEY `user_id` (`user_id`),

ADD KEY `index7` (`revision`),

ADD KEY `created` (`created`),

ADD KEY `ip-country` (`country`,`ip`) USING BTREE,

ADD KEY `object_group` (`object_group`,`object_id`) USING BTREE,

ADD KEY `status` (`status`),

ADD KEY `userid_id` (`user_id`,`id`),

ADD KEY `object_group_2` (`object_group`,`object_id`,`rate`) USING BTREE;

ФИРМЫ

-- Структура таблицы `firm`
--

CREATE TABLE `firm` (
`id` int(11) NOT NULL,
`category_id` int(11) NOT NULL,
`section_id` int(11) NOT NULL,
`city_id` int(11) NOT NULL,
`group_id` int(11) NOT NULL,
`alias` varchar(255) CHARACTER SET utf8 NOT NULL,
`created` datetime NOT NULL,
`modified` datetime NOT NULL,
`name` varchar(255) CHARACTER SET utf8 NOT NULL,
`title` varchar(255) CHARACTER SET utf8 NOT NULL,
`keywords` text CHARACTER SET utf8 NOT NULL,
`description` text CHARACTER SET utf8 NOT NULL,
`header` varchar(255) CHARACTER SET utf8 NOT NULL,
`text` text CHARACTER SET utf8 NOT NULL,
`preview_src` varchar(255) CHARACTER SET utf8 NOT NULL,
`preview_alt` varchar(255) CHARACTER SET utf8 NOT NULL,
`preview_title` varchar(255) CHARACTER SET utf8 NOT NULL,
`preview_border` int(11) NOT NULL,
`reviews` datetime NOT NULL,
`rate` int(11) NOT NULL,
`vote` int(11) NOT NULL,
`average` float NOT NULL,
`comments` int(11) NOT NULL,
`count_agents` int(11) NOT NULL,
`count_doctors` int(11) NOT NULL,
`count_images` int(11) NOT NULL,
`count_stock` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

--
-- Индексы сохранённых таблиц
--

--
-- Индексы таблицы `firm`
--
ALTER TABLE `firm`
ADD PRIMARY KEY (`id`),
ADD KEY `group_id` (`group_id`),
ADD KEY `average` (`average`),
ADD KEY `name` (`name`),
ADD KEY `category_id` (`category_id`),
ADD KEY `section_id` (`section_id`),
ADD KEY `city_id` (`city_id`);
123

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий