Сегодня возникла задача : выбрать самую старую и самую свежую запись из БД. Нужно это было, для того, что бы найти товары, цены корых максимально подскачили или упали с самого начала продаж. Для этого, я заносил изменения цен в отдельную таблицу.

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
        )

)

После выборки контрольных точек каждого товара, остается перевести разницу в проценты и вывести максимальные значения.

Наши клиенты

Большая часть наших клиентов становится постоянными, мы работаем уже 7 лет и за нашими плечами накопился большой опыт, как в разработке сайтов, так и в работе с людьми. Закажите создание сайта в нашей фирме и вы не будете разочарованы!
Сайт носит информационный характер и не является публичной офертой