Помогите с запросом

DinDim

Новичок
Помогите с запросом

Здравствуйте. Есть таблица positions (int id, int idkeyword, int idsite, int position, date datezap). В нее ежедневно заносятся записи о позиции сайта (idsite - связан с таблицей sites) по ключевым словам (idkeyword - связан с таблицей keywords) в поисковиках в поле position. Мне необходимо выбрать последние 2 занесенные записи для каждого ключевого слова, сравнить в этих двух записях поле positions и вынести соответствующее решение о том. как изменилась позиция сайта. Скажите можно ли это сделать одним запросом, если да то натокните на мысль, если нет подскажите оптимальное решение для этой задачи
 

Gas

может по одной?
Как-то так
Код:
SET @row = '', @last = NULL, @tmp = NULL;
SELECT * FROM (
  SELECT 
    idsite,idkeyword, 
    if(@row <> CONCAT(idsite,':',idkeyword), 
       IF((@row := CONCAT(idsite,':',idkeyword)) AND (@last := `position`), NULL, NULL),
       IF((@tmp := @last-`position`) IS NULL, @tmp, COALESCE(@last:=NULL, @tmp))
    ) AS position_delta
  FROM positions
  ORDER BY idsite DESC, idkeyword DESC, id DESC
) AS t
WHERE position_delta IS NOT NULL;
если будет индекс (idsite,idkeyword,id) - filesort'а не будет, но всё равно будет создаваться temporary table всей таблицы.
Так что по скорости это может быть далеко не лучший вариант.

Использовались такие предположения:
1. id - автоинкремент
2. в `position` не может быть null значений.

Возращает для каждой пары значений idsite,idkeyword не 2 записи, а одну с разницей в последних позициях, можно переделать чтоб возращались и 2 записи.

p.s. правда тут 2 запроса
 

chira

Новичок
DinDim
Добавь в таблицу positions поле position_delta и вычисляей его во время добавления новой записи один раз в сутки.
 

DinDim

Новичок
chira
Спасибо за совет, теперь нужно подумать каким образом оптимальней вычислять это поле. В цикле, который запосит позиции по словам тоже выполняется работа которая занпимает много времени (запрос к поисковику, получение ответа, разбор результата...), так что нужно чтобы задача вычисления дельты была минимальной по времени. Но мысль очень интересная...
 

chira

Новичок
DinDim
сделай временную таблицу для сбора инфы с поисковиков, потом запросами из этой таблицы и таблицы positions найдёшь разницу и сгенеришь новые записи в positions.
 
Сверху