У меня есть этот код, но я не могу заставить его работать:
images = Image.find_by_sql('PREPARE stmt FROM \' SELECT * FROM images AS i WHERE i.on_id = 1 AND i.on_type = "profile" ORDER BY i.updated_at LIMIT ?, 6\'; SET @lower_limit := ((5 DIV 6) * 6); EXECUTE stmt USING @lower_limit;')
Я получил эту ошибку:
Mysql :: Error: у вас есть ошибка в вашем синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы узнать правильный синтаксис для использования рядом с 'SET @lower_limit: = ((5 DIV 6) * 6); ВЫПОЛНИТЬ stmt, ИСПОЛЬЗУЯ @lower_limit 'в строке 1: ПОДГОТОВИТЬ СТМТ ИЗ' ВЫБРАТЬ * ИЗ ИЗОБРАЖЕНИЙ КАК i ГДЕ i.on_id = 1 И i.on_type = "profile" ЗАКАЗАТЬ i.updated_at LIMIT?, 6 '; SET @lower_limit: = ((5 DIV 6) * 6); EXECUTE stmt USING @lower_limit;
но если я использую приложение sql, вот так, оно работает:
PREPARE stmt FROM ' SELECT * FROM images AS i WHERE i.on_id = 1 AND i.on_type = "profile" ORDER BY i.updated_at LIMIT ?, 6'; SET @lower_limit := ((5 DIV 6) * 6); EXECUTE stmt USING @lower_limit;
РЕШИТЬ:
Это генерирует 2 запроса и хуже, но теперь я могу получить смещение изображения.
Обратный путь был только с одним запросом, но я не получил бы никакого смещения изображения, и в любом случае я не мог заставить его работать.
def self.get_image_offset(id)
image_offset = Image.find_by_sql("SELECT COUNT(id) as pos FROM images WHERE updated_at <= (SELECT updated_at FROM images WHERE id = #{id})")[0].pos.to_i
end
def self.get_group_offset(id, per_block, image_offset = nil)
image_offset ||= Image.get_image_offset(id)
group_offset = (image_offset / per_block).floor * per_block
{:image_offset => image_offset, :group_offset => group_offset, :group_number => ( group_offset + per_block ) / per_block}
end