Как выбрать самую старую и самую свежую запись из MySql
Сегодня возникла задача : выбрать самую старую и самую свежую запись из БД. Нужно это было, для того, что бы найти товары, цены корых максимально подскачили или упали с самого начала продаж. Для этого, я заносил изменения цен в отдельную таблицу.
CREATE TABLE IF NOT EXISTS tovar_price ( id int(8) NOT NULL AUTO_INCREMENT, tovar_id int(8) NOT NULL DEFAULT 0, /*товар, к которому относится цена*/ price float NOT NULL, /*сама цена*/ UPDATE_TIME date NOT NULL, /*дата занесения цены в базу*/ PRIMARY KEY (id) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=0;
Вариантов решения несколько, однако, хотелось все запихать в 1 запрос.
Вот, что получилось.
Запрос из Kohana
$prices=DB::query(Database::SELECT, "(SELECT * FROM tovar_price where tovar_id=:tovarid order by UPDATE_TIME LIMIT 1) UNION (SELECT * FROM tovar_price where tovar_id=:tovarid order by UPDATE_TIME DESC LIMIT 1) ") ->parameters(array(":tovarid"=>$tovar["id"])) ->execute()->as_array();
Чистый Sql
Опустим все ненужные условия. Выборка идет из таблицы цен на товары.
/*Выбираем все поля из таблицы и сортируем их (order by) по дате, одновременно ограничивая выдачу до 1 строки (LIMIT 1) */ (SELECT * FROM tovar_price order by UPDATE_TIME LIMIT 1) UNION (SELECT * FROM tovar_price order by UPDATE_TIME DESC LIMIT 1)
В данном примере, мы просто объединили 2 SELECT запроса в 1 с помощью оператора UNION
Часть выдачи
Array ( [0] => Array ( [id] => 447 [tovar_id] => 246 [price] => 13500 [UPDATE_TIME] => 2013-11-08 ) [1] => Array ( [id] => 1825 [tovar_id] => 246 [price] => 13400 [UPDATE_TIME] => 2013-12-25 ) )
После выборки контрольных точек каждого товара, остается перевести разницу в проценты и вывести максимальные значения.
Мои услуги: Специалист Битрикс